Выбор нескольких уникальных максимальных значений из одной таблицы по 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 шт):
Можно воспользоваться запросом ниже - он выведет случайный максимальный комментарий для записи:
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
Пример работы можно посмотреть тут


