Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: хитрый запрос :))
 
 автор: Axxil   (21.10.2004 в 19:49)   письмо автору
 
 

Подскажите пожалуйста:
есть таблица messages(форум)
поля
mess_id первичный ключ
...
usr_id (ИД автора сообщения)
top_id номер темы
answerto (№ сообщения на которое отвечает пользователь)
В answerto записывается значение поля mess_id.
Задача найти все ответы заданному пользователю в пределах одной темы.

   
 
 автор: glsv (Дизайнер)   (21.10.2004 в 21:02)   письмо автору
 
   для: 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: где то мог ошибиться в синтаксисе, так как писал вслепую.

   
 
 автор: cheops   (21.10.2004 в 21:13)   письмо автору
 
   для: 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   (22.10.2004 в 10:35)   письмо автору
 
   для: Axxil   (21.10.2004 в 19:49)
 

Спасибо, попробую.
А сколько примерно времени занимает один запрос к базе. И какое их кол-во может существенно повлиять на производительность?

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования