Как ограничить выборку запроса с объединением таблиц по одной таблице на SQL

Есть две таблицы со связью «один к многим»: таблица articles со статьями и comments с соответствующими комментариями. Обычная выборка из них производится следующим образом (выбираются последние статьи и первые комментарии к ним):

SELECT
  articles.title,
  articles.date,
  comments.author,
  comments.text
FROM
  articles
  INNER JOIN comments ON comments.article = articles.id
ORDER BY
  articles.id DESC,
  comments.id ASC


Как оформить запрос так, чтобы:
  1. Выбиралось только нужное число статей (например, 10) со всеми комментариями?
  2. К каждой статье выбиралось ограниченное число комментариев?
  3. Выбиралось ограниченное число статей и ограниченное число комментариев к ним?


Не знаю, возможно ли сделать это одним запросом, но может быть… Буду очень признателен за помощь.
  • Вопрос задан
  • 3743 просмотра
Решения вопроса 1
@kazmiruk
1. Вместо обычно джойна делаем немного необычный:
SELECT *
FROM comments as c
INNER JOIN (SELECT * FROM articles LIMIT 10) as a
ON a.id = c.aticle_id
2. Одним запросом никак.
3. Одним запросом никак.

2 и 3 делается обычным селектом статей с limit или без, а затем выборкой комментариев для каждой статьи с лимитом или без.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Посмотри в сторону команд top или limit
Ответ написан
Комментировать
Для 2 и 3 можно так:
SELECT   t1.title, t1.date, t1.author, t1.text  
FROM         
(SELECT     articles.title, articles.date, comments.author, comments.text, articles.id as aid, comments.id as cid, DENSE_RANK() OVER   ( ORDER BY articles.id DESC) as article_row, row_number () over (partition by articles.id order by comments.id) as comment_row
FROM    articles INNER JOIN  comments ON articles.id = comments.article   ) AS t1
WHERE t1.article_row<=2 and t1.comment_row<=5
ORDER BY t1.aid DESC, t1.cid


Хотя этот вариант не оптимален по скорости, т.к. фактически сначала нумеруются статьи и комментарии к каждой статье, а затем уже отрезается лишнее.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы