Megas
@Megas

Как отобразить значение с наивысшем параметром в списке?

Вот упрощенная схема БД:

50aa3e440f0e42b2a8ea5bbc06e883c8.png

У каждой группы есть множество юзеров и каждый юзер может состоять в множестве групп.

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

Чтоб получить такого юзера для какойто конкретно группы, я делаю так:

SELECT *
FROM users
WHERE id IN (
    SELECT user_id FROM user_to_groups WHERE group_id = XX
)
ORDER BY score DESC
LIMIT 1


Но теперь надо это сделать для списка всех групп. Я попробовал сделать нечто подобное:
SELECT g.*, best.*
FROM groups as g
LEFT JOIN (
    SELECT *
    FROM users
    WHERE id IN (
        SELECT user_id FROM user_to_groups WHERE group_id = g.id
    )
    ORDER BY score DESC
    LIMIT 1
) as best

Но само собой это не корректный запрос и поэтому он не работает.
Ктото знает как эта проблема решается?

В теории это решается просто, но я чтото не могу подобрать ключевые слова, чтоб самому найти решение в гугле.
  • Вопрос задан
  • 81 просмотр
Пригласить эксперта
Ответы на вопрос 2
VladimirAndreev
@VladimirAndreev
php web dev
select
g.*
max(u.score)
from g
join u2g USING(group_id)
join u USING(user_id)
group by g.group_id
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Что-то наподобие такого:
SELECT `g`.`name`, `u`.`name`, `u`.`score`
  FROM (
    SELECT `ug`.`group_id` AS `group_id`, MAX(`u`.`score`) AS `score`
      FROM `user_to_groups` AS `ug`
      JOIN `users` AS `u` ON `u`.`id` = `ug`.`user_id`
      GROUP BY `ug`.`group_id`
  ) AS `m`
  JOIN `user_to_groups` AS `ug` ON `ug`.`group_id` = `m`.`group_id`
  JOIN `users` AS `u` ON `u`.`id` = `ug`.`user_id` AND `u`.`score` = `m`.`score`
  JOIN `groups` AS `g` ON `g`.`id` = `m`.`group_id`

Только если в группе будет несколько пользователей с максимальным `score`, то выдаст их всех.
Ответ написан
Ваш ответ на вопрос

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

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