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

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

  • первый с постами (название и дата постов);
  • второй с комментариями каждого поста (название и дата комментариев)

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

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

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

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

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

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

Gordon Linoff 22.12.2020 17:37

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

jose 22.12.2020 17:38
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
2
126
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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.

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

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

jose 22.12.2020 17:53

Хе-хе-хе, сколько путешественников во времени я видел в базах данных ;)

MatBailie 22.12.2020 18:11

Другие вопросы по теме