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

Форум MySQL

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

 

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

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

тема: Запрос: последние сообщения форума
 
 автор: Axxil   (22.11.2006 в 22:44)   письмо автору
 
 

Второй день не могу составить элементарный запрос.
Нужно вывести последние темы форума (т.е. темы в котоых последние сообщения).
Структура:

Структура таблицы с форумами:
forum_id | name
Структура таблицы с темами:
thread_id | name | forum_id
Структура таблицы с сообщениями:
mess_id | text | thread_id


Как это сделать одним запросом?

   
 
 автор: AlexelA   (22.11.2006 в 23:54)   письмо автору
 
   для: Axxil   (22.11.2006 в 22:44)
 

Ну например так:
select name from <имя таблицы с темами>
where thread_id in(select thread_id from <имя таблицы с сообщениями>
where mess_id = MAX(mess_id));
Я, к сожалению, сейчас не могу его проверить, но думаю должно сработать.

   
 
 автор: Axxil   (23.11.2006 в 00:02)   письмо автору
 
   для: AlexelA   (22.11.2006 в 23:54)
 

Осталось только научить MySQL 3 понимать вложенные запросы :)
Желательно штатными средствами.
Я как-то раньше делал. Только забыл. Давно уже форумы не писал...

   
 
 автор: AlexelA   (23.11.2006 в 00:28)   письмо автору
 
   для: Axxil   (23.11.2006 в 00:02)
 

К сожалению, начал работать с 4-ой версии и не знаю,
пойдет ли такой запрос:

Пусть t1 - таблица с темами
t2 - таблица с сообщениями
Тогда

select t1.name,t1.thread_id,t2.thread_id,t2.mess_id from t1,t2
where t1.thread_id = t2.thread_id and t2.mess_id = MAX(t2.mess_id);

Ну а потом, средствами любого языка, выбрать переменную с именем t1.name
Так пойдет?

   
 
 автор: Axxil   (23.11.2006 в 09:16)   письмо автору
 
   для: AlexelA   (23.11.2006 в 00:28)
 

Не, так не будет работать
Invalid use of group function

   
 
 автор: AlexelA   (23.11.2006 в 12:27)   письмо автору
 
   для: Axxil   (23.11.2006 в 09:16)
 

Согласен, стал уже забывать mysql
Исправляюсь:

select f.name, f.thread_id, m.thread_id,MAX(mess_id)
from <имя таблицы с темами> f, <имя таблицы с сообщениями> m
where f.thread_id = m.thread_id
group by (m.thread_id)
order by (m.mess_id) DESC
limit 2

В данном случае ограничиваемся последними 2 сообщениями
Так должно получиться

   
 
 автор: cheops   (23.11.2006 в 00:44)   письмо автору
 
   для: Axxil   (22.11.2006 в 22:44)
 

У вас нет поля даты - вы по номеру сообщений ориентируетесь?

   
 
 автор: Axxil   (23.11.2006 в 09:11)   письмо автору
 
   для: cheops   (23.11.2006 в 00:44)
 

Точно. На самом деле там полно ещё полей. Я привёл основные.
Ну, считаем что в таблицах threads и messages есть ещё поля даты (thread_date,mess_date).

   
 
 автор: Loki   (23.11.2006 в 10:07)   письмо автору
 
   для: Axxil   (22.11.2006 в 22:44)
 


SELECT t.name, f.name, thread_id, forum_id FROM posts p LEFT JOIN thread t ON p.thread_id=t.thread_id LEFT JOIN forums f ON t.forum_id=f.forum_id ORDER BY mess_id DESC LIMIT 5

как-то так...

ни или вроде такого:

SELECT t.name, f.name, thread_id, forum_id FROM posts p, thread t, forums f  WHERE p.thread_id=t.thread_id AND t.forum_id=f.forum_id ORDER BY mess_id DESC LIMIT 5

   
 
 автор: Axxil   (23.11.2006 в 10:36)   письмо автору
 
   для: Loki   (23.11.2006 в 10:07)
 

Опять мимо...
Это первое было что я попробовал...
Трабл в том что сообщений в теме может быть много и данный запрос не делает уникальность тем.
Т.е. грубо говоря если в одной теме было 5 последних сообщений, то запрос выведет 5 раз эту тему. А надо чтоб было 5 последних разных тем

   
 
 автор: Loki   (23.11.2006 в 11:33)   письмо автору
 
   для: Axxil   (23.11.2006 в 10:36)
 


SELECT t.name, f.name, DISTINCT(thread_id), forum_id FROM posts p, thread t, forums f  WHERE p.thread_id=t.thread_id AND t.forum_id=f.forum_id ORDER BY mess_id DESC LIMIT 5

или

SELECT t.name, f.name, thread_id, forum_id FROM posts p, thread t, forums f  WHERE p.thread_id=t.thread_id AND t.forum_id=f.forum_id ORDER BY mess_id DESC GROUP BY thread_id LIMIT 5

   
Rambler's Top100
вверх

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