Выбор нескольких уникальных максимальных значений из одной таблицы по id в MySQL

Нужно выбрать комментарии с максимальным рейтингом для новостей из таблицы по id. В первой таблице список новостей:

введите сюда описание изображения

Во второй список комментариев:

введите сюда описание изображения

Мне нужно выбрать комментарии с максимальным рейтингом для каждой новости. Если рейтинг совпадает, показать первое выбранное значение.

Использую такой запрос.

SELECT n.id, n.title, t.comment, t.rating
FROM news n 
JOIN (
  SELECT a.rating rating, a.comment, a.news_id 
  FROM comments a
  RIGHT JOIN (
    SELECT r.news_id, MAX(r.rating) rating
    FROM comments r
    GROUP BY r.news_id
  ) b ON b.news_id = a.news_id AND b.rating = a.rating
) t ON t.news_id = n.id

Если рейтинг комментариев совпадает, то выводятся сразу два, вместо одного. Группировать не получается, так как поле комментарий не совпадает.

введите сюда описание изображения

Подскажите, каким образом можно отобразить только один комментарий к каждой новости с максимальным рейтингом?


Ответы (1 шт):

Автор решения: Novitskiy Denis

Можно воспользоваться запросом ниже - он выведет случайный максимальный комментарий для записи:

select n.id, n.title, cc.comment, cc.rating from news n join (select c1.news_id, c1.rating, min(c1.comment) as comment
from comments c1
left join comments c2 on c1.news_id=c2.news_id and c2.rating>c1.rating
where c2.rating is null
group by c1.news_id, c1.rating) cc on n.id=cc.news_id

Если есть возможность перейти на MySQL 8 - более предпочтительно использовать INNER JOIN LATERAl - с ним запрос позволит брать именно самый первый комментарий:

select n.id, n.title, cc.comment, cc.rating
from news n INNER JOIN LATERAl (select c.news_id, c.comment, c.rating
from comments c
where n.id=c.news_id
order by c.rating desc, c.id
limit 1) cc on n.id=cc.news_id

Пример работы можно посмотреть тут

→ Ссылка