Оптимальный способ группировки данных в запросе
Извиняюсь, тут за свою лень или тупость в праздник дня победы, однако вынужден прибегнуть к помощи своих коллег. Есть таблица article с полями id|article_text и связанная таблица comment_article id|code_art|code_user|text. Цель вывести статьи блога с комментариями пользователей (самые три последние комментария у каждого блога).
Формирую запрос таким образом:
SELECT * FROM `article` as art
JOIN `comment_article` ca ON ca.code_art IN
(
SELECT `id`, COUNT(code_art)
FROM `comment_art`
GROUP BY code_art
HAVING COUNT(code_art) < 4
) Group By code_art;
Либо так:
SELECT * FROM `comment_article` as tm1
JOIN (
SELECT `id`, COUNT(code_art)
FROM `comment_article`
GROUP BY code_art
HAVING COUNT(code_art) < 4
) c
ON tm1.id = c.id
Group By code_art;
Все не так выполняет работу, что идеи переписать запрос с конструкцией LIMIT, без HAVING наталкивается на проблему низкой версии MySQL, она у меня 5.6. Помогите правильно составить запрос, чтобы сгруппировать записи комментариев у каждой статьи, учитывая, что комментариев может и не быть, либо они напротив их может быть очень много. Изначально мне казалось это легкой задачей, однако, кажется давно не практиковался в многоуровневых запросах, потому забыл... Использование подпрограмм тоже тут мне, кажется, нецелесообразным.
Ответы (1 шт):
select * from article as art
left join (
SELECT comment_article.*, @rank := CASE
WHEN @partval = code_art THEN @rank + 1
WHEN (@partval := code_art) IS NOT NULL THEN 1
END AS rnum
FROM comment_article, (SELECT @rank := NULL, @partval := NULL) AS x
ORDER BY code_art, id
) ca on ca.code_art = art.id
where ca.id is null or ca.rnum < 4
order by art.id, ca.id
описание таблиц с данными и примеры sql-запросов тут -> DB<>FIDDLE MySQL 5.6