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

Извиняюсь, тут за свою лень или тупость в праздник дня победы, однако вынужден прибегнуть к помощи своих коллег. Есть таблица 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 шт):

Автор решения: Timur Irdyneev
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

→ Ссылка