|
|
|
| Подскажите пожалуйста:
есть таблица messages(форум)
поля
mess_id первичный ключ
...
usr_id (ИД автора сообщения)
top_id номер темы
answerto (№ сообщения на которое отвечает пользователь)
В answerto записывается значение поля mess_id.
Задача найти все ответы заданному пользователю в пределах одной темы. | |
|
|
|
|
|
|
|
для: Axxil
(21.10.2004 в 19:49)
| | В один запрос не выйдет
<?
// Находим все сообщения автора usr_id в пределах темы id_theme, котороые затем будем использовать.
$query = "Select * FROM messages Where top_td=<?= id_theme ?> and usr_id=<?= usr_id ?>";
$res = mysql_query($query);
while ($row = mysql_fetch_assoc($res))
{
$query2="Select * FROM messages Where top_td=<?= id_theme ?> and answerto=". $row['mess_id '];
// Теперь ищем все ответы на выбранные ранее сообщения.
$res2 = mysql_query($query2);
while ($mess = mysql_fetch_assoc($res2))
{
// Выводим идентификаторы найденных ответов
echo $mess[mess_id]."<br>";
}
}
?>
|
PS: где то мог ошибиться в синтаксисе, так как писал вслепую. | |
|
|
|
|
|
|
|
для: Axxil
(21.10.2004 в 19:49)
| | Хм... вообще-то у людей (я имеею ввиду другие СУБД) для этих целей используются подчинённые запросы
SELECT * FROM messages
WHERE answerto IN SELECT messid FROM messages
WHERE top_id = 14 AND
usr_id = 6
|
Этот запрос вернёт все сообщения в теме с ключом 14, являющиеся ответом на сообщения автора с ключом 6. Но в MySQL по крайней мере в версии 4.* такое не пройдёт - обычно для этого осуществляют два запроса: по результатам первого формируется список сообщений в теме автора для которого осуществляется поиск:
SELECT messid FROM messages
WHERE top_id = 14 AND
usr_id = 6
|
пусть результат будет 15, 29, 45, 67. Второй ищет сообщения, которые являются ответом на эти сообщения:
SELECT * FROM messages
WHERE answerto IN (15, 29, 45, 67)
|
список лучше формировать следующим образом
<?php
$query = "SELECT messid FROM messages
WHERE top_id = 14 AND
usr_id = 6";
$pst = mysql_query($query);
if(!$pst)
{
echo "Ошибка в первом запросе";
exit();
}
// Формируем список сообщений
$str = "(";
while($post = mysql_fetch_array($pst))
{
$str .= $post['messid'].","
}
// Удаляем последнюю запятую и добавляем закрывающую скобку
$str = substr($str,0,strlen($str) - 1).")";
$query = "SELECT * FROM messages
WHERE answerto IN ".$str;
$res = mysql_query($query);
if(!$res)
{
echo "Ошибка во втором запросе";
exit();
}
while($res_post = mysql_fetch_array($res))
{
// ... выводим $res_post[''] ...
}
?>
|
| |
|
|
|
|
|
|
|
для: Axxil
(21.10.2004 в 19:49)
| | Спасибо, попробую.
А сколько примерно времени занимает один запрос к базе. И какое их кол-во может существенно повлиять на производительность? | |
|
|
|