|
|
|
| Подскажите, как лучше вывести последние сообщения в темах форума
структура 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 при создании поста, но тогда придется заботиться об обновлении данных при удалении сообщения итд
можно конечно и на триггер повесить, подскажите как лучше сделать? | |
|
|
|
|
|
|
|
для: Visavi
(10.12.2015 в 17:50)
| | вариантов масса и все они не подразумевают триггеры (ну никак ваще)
не пойму что это where topic_id in (1,2) ну да ладно
1) вариант
подзапросом с группировкой по топикам из таблицы постов вытаскиваем максимальные id(последние сообщения) и джоиним с этой же таблицей постов для выборки самих постов.
2) вариатнт
заводим отдельную таблицу связи topic_id | last_post_id (это взамест подзапроса с группировкой)
и опять же джоиним с таблицей posts
я бы остановился для начала на первом варианте, если в последствии будет большая нагрузка по этому запросу, то не трудно зашпандорить таблицу, изменения кода будут минимальны | |
|
|
|
|
|
|
|
для: Valick
(10.12.2015 в 20:02)
| | Спасибо, за ответ,
а если пойти со стороны таблицы topics, и делать join к posts, то есть нужен список 10 тем и по 1 последнему сообщению, можно ли так сделать? | |
|
|
|
|
|
|
|
для: Visavi
(11.12.2015 в 09:05)
| | можно | |
|
|
|
|
|
|
|
для: 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, то выполняется после группировки и ничего не находит | |
|
|
|
|
|
|
|
для: 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 | |
|
|
|
|
|
|
|
для: Visavi
(10.12.2015 в 17:50)
| | последние сообщения в темах форума так же, как и последние комментарии ..совершенно не нужная никому функция...проще подымать или выделять обсуждаемую активно тему.. | |
|
|
|
|
|
|
|
для: S_7
(10.12.2015 в 23:54)
| | S_7, для того что бы выделить тему в которой появились непрочитанные сообщения как раз можно использовать подобные алгоритмы. | |
|
|
|