упорядочить по датам из двух таблиц

#mysql #sql

#mysql #sql

Вопрос:

В качестве примера, две таблицы:

  • первая с сообщениями (заголовок и дата сообщений);
  • второй с комментариями к каждому сообщению (заголовок и дата комментариев)

Я хочу перечислить только сообщения, упорядоченные по дате.

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

Первое сообщение в списке — это сообщение с самой последней датой сообщения или комментария

ПРИМЕР: запрос с ЛЕВЫМ СОЕДИНЕНИЕМ, просто для иллюстрации, поскольку цель состоит в том, чтобы перечислить только записи.

 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
 

Комментарии:

1. Пометьте свой вопрос базой данных, которую вы используете.

2. Спасибо, это mysql.

Ответ №1:

Вы можете использовать подзапрос в 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 .

Если вы хотите сделать это с помощью a 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)
 

Комментарии:

1. Спасибо Гордон Линофф

2. Хехехе, количество путешественников во времени, которые я видел в базах данных 😉