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

Форум MySQL

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

 

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

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

тема: Вывод последних сообщений в темах форума
 
 автор: Visavi   (10.12.2015 в 17:50)   письмо автору
 
 

Подскажите, как лучше вывести последние сообщения в темах форума

структура topics
|id|title|user_id|updated_at|created_at|


структура posts
|id|topic_id|user_id|text|updated_at|created_at|


запрос что-то вроде
SELECT * FROM posts where topic_id in (1,2) group by topic_id order by created_at desc;

Но не работает сортировка после группировки

Пробовал подзапросом
SELECT * FROM (select * from posts where topic_id in (1,2) order by created_at desc) as ordered where topic_id in (1,2) group by topic_id order by created_at desc; 


работает, но хотелось бы без вложенного запроса
пытался подойти и через таблицу topics join posts. но ничего не выходит

Вот здесь на форуме как-то выводится автор и время последнего сообщения, возможно все это сохраняется в topics при создании поста, но тогда придется заботиться об обновлении данных при удалении сообщения итд

можно конечно и на триггер повесить, подскажите как лучше сделать?

  Ответить  
 
 автор: Valick   (10.12.2015 в 20:02)   письмо автору
 
   для: Visavi   (10.12.2015 в 17:50)
 

вариантов масса и все они не подразумевают триггеры (ну никак ваще)
не пойму что это where topic_id in (1,2) ну да ладно
1) вариант
подзапросом с группировкой по топикам из таблицы постов вытаскиваем максимальные id(последние сообщения) и джоиним с этой же таблицей постов для выборки самих постов.
2) вариатнт
заводим отдельную таблицу связи topic_id | last_post_id (это взамест подзапроса с группировкой)
и опять же джоиним с таблицей posts

я бы остановился для начала на первом варианте, если в последствии будет большая нагрузка по этому запросу, то не трудно зашпандорить таблицу, изменения кода будут минимальны

  Ответить  
 
 автор: Visavi   (11.12.2015 в 09:05)   письмо автору
 
   для: Valick   (10.12.2015 в 20:02)
 

Спасибо, за ответ,
а если пойти со стороны таблицы topics, и делать join к posts, то есть нужен список 10 тем и по 1 последнему сообщению, можно ли так сделать?

  Ответить  
 
 автор: Valick   (11.12.2015 в 09:31)   письмо автору
 
   для: Visavi   (11.12.2015 в 09:05)
 

можно

  Ответить  
 
 автор: Visavi   (11.12.2015 в 13:40)   письмо автору
 
   для: Valick   (11.12.2015 в 09:31)
 

Не могли бы вы подсказать как,
я делаю что-то вроде

SELECT t.*, p.id post_id, p.created_at created, max(p.created_at) max 
from topics t
join posts p on t.id=p.topic_id and created=max
where t.id in (1,2) 
group by p.topic_id


не работает, потому что max и created не видно в join, а если вынести в
having created=max, то выполняется после группировки и ничего не находит

  Ответить  
 
 автор: Visavi   (13.12.2015 в 20:08)   письмо автору
 
   для: Valick   (10.12.2015 в 20:02)
 

Сделал вот примерно так

SELECT t.*, p.id, p.created_at
FROM topics t
LEFT JOIN (
   SELECT topic_id, MAX(created_at) AS max FROM posts 
   GROUP BY topic_id
) AS latest ON t.id = latest.topic_id
LEFT JOIN posts p ON p.created_at = latest.max 
AND p.topic_id = latest.topic_id
WHERE t.forum_id = 1
ORDER BY t.updated_at DESC
limit 10;


можно конечно использовать и сортировку по времени создания поста ORDER BY p.created_at DESC

  Ответить  
 
 автор: S_7   (10.12.2015 в 23:54)   письмо автору
 
   для: Visavi   (10.12.2015 в 17:50)
 

последние сообщения в темах форума так же, как и последние комментарии ..совершенно не нужная никому функция...проще подымать или выделять обсуждаемую активно тему..

  Ответить  
 
 автор: Valick   (11.12.2015 в 07:48)   письмо автору
 
   для: S_7   (10.12.2015 в 23:54)
 

S_7, для того что бы выделить тему в которой появились непрочитанные сообщения как раз можно использовать подобные алгоритмы.

  Ответить  
Rambler's Top100
вверх

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