Получение последних N новостей и всех их комментариев

20. Получить последние N новостей и все их комментарии

Условие задачи:
Даны две таблицы:

  • news — новости;

  • comments — комментарии к новостям.

Необходимо одним SQL-запросом получить последние N новостей вместе со всеми комментариями к ним.

Код:

news

id INT AUTO_INCREMENT PRIMARY KEY
comments

id      INT AUTO_INCREMENT PRIMARY KEY
news_id INT

Спойлеры к решению

Подсказки
💡 Сначала нужно выбрать именно последние N новостей.
💡 Ограничение LIMIT важно применить до соединения с комментариями.
💡 После этого выбранные новости можно соединить с comments через LEFT JOIN.
💡 LEFT JOIN позволит сохранить новости, у которых нет комментариев.

Решение

Вариант через CTE:

WITH latest_news AS (
    SELECT *
    FROM news
    ORDER BY id DESC
    LIMIT :n
)
SELECT
    ln.*,
    c.*
FROM latest_news ln
LEFT JOIN comments c
    ON c.news_id = ln.id
ORDER BY ln.id DESC, c.id;

Сначала CTE:

SELECT *
FROM news
ORDER BY id DESC
LIMIT :n

выбирает последние N новостей.

После этого LEFT JOIN добавляет к каждой выбранной новости все её комментарии.

Важно применять LIMIT именно к новостям до JOIN. Если сначала соединить news с comments, а затем выполнить LIMIT N, ограничение будет применено к строкам результата, а не к количеству новостей.

Альтернативный вариант без CTE:

SELECT
    n.*,
    c.*
FROM (
    SELECT *
    FROM news
    ORDER BY id DESC
    LIMIT :n
) n
LEFT JOIN comments c
    ON c.news_id = n.id
ORDER BY n.id DESC, c.id;

Оба варианта возвращают последние N новостей и все связанные с ними комментарии.