В качестве примера две таблицы:
Я хочу перечислить только сообщения, упорядоченные по дате.
Порядок должен быть сделан с учетом дат постов и дат комментариев.
Первым сообщением в списке является сообщение с самой последней датой публикации или комментария.
ПРИМЕР: запрос с ЛЕВЫМ СОЕДИНЕНИЕМ, просто для иллюстрации, поскольку цель состоит в том, чтобы перечислить только сообщения.
SELECT *
FROM posts p
LEFT JOIN comments c ON p.id_post = c.id_post
ORDER BY CASE WHEN c.comment_date > p.post_date
THEN c.comment_date ELSE p.post_date END
DESC
Спасибо, это mysql.
Вы можете использовать подзапрос в order by
:
order by (select (case when max(c.comment_date) > p.post_date
then max(c.comment_date)
else p.post_date
end)
from comments c
where c.id_post = p.id_post
) DESC
Примечание. Даже если ваша база данных поддерживает GREATEST()
, это не лучший выбор, потому что она (обычно) возвращает NULL
, если какой-либо аргумент равен NULL
.
Если вы хотите сделать это с помощью LEFT JOIN
, вам нужно сначала агрегировать:
SELECT p.*
FROM posts p LEFT JOIN
(SELECT c.id_post, MAX(c.comment_date) as max_comment_date
FROM comments c
GROUP BY c.id_post
) c
ON p.id_post = c.id_post
ORDER BY (CASE WHEN c.comment_date > p.post_date
THEN c.comment_date ELSE p.post_date
END) DESC;
На практике я ожидаю, что комментарии появятся только после сообщения, поэтому это можно упростить до:
ORDER BY COALESCE(c.comment_date, p.post_date)
Спасибо, Гордон Линофф.
Хе-хе-хе, сколько путешественников во времени я видел в базах данных ;)
Отметьте свой вопрос с помощью базы данных, которую вы используете.