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 новостей и все связанные с ними комментарии.