MySQL: получить максимальные значения групп - PullRequest
1 голос
/ 27 марта 2011

У меня есть таблица:

user_id | fav_song_genre | votes_as_fav_member
--------+----------------+--------------------
      1 | hip hop        | 3
      2 | hip hop        | 5
      3 | rock           | 8
      4 | rock           | 6

Как получить только результаты user_id с наибольшим голосов_as_fav_member на группу fav_song_genre:

Что-то вроде

SELECT *, MAX(votes_as_fav_member) as most_votes 
FROM   table 
GROUP BY 
       fav_song_genre

Я использую это, но это не дает мне идентификаторы участников с большинством голосов в жанре.

Ответы [ 4 ]

5 голосов
/ 27 марта 2011

Это не проблема MySQL, скорее логическая проблема с вашим подходом.

Допустим, у нас есть следующее:

user_id | fav_song_genre | votes_as_fav_member
--------+----------------+--------------------
      1 | hip hop        | 3
      2 | hip hop        | 5
      3 | rock           | 8
      4 | rock           | 6
      5 | hip hop        | 5
      6 | rock           | 8

Какой идентификатор должен возвращать запрос?Должен ли он вернуть только один?или все те, у кого одинаковое количество голосов?

Итак, если вам требуется только один идентификатор, в чем отличие ничьей?

Ливен опередил меня в разрешении SQL на несколькосекунды.

4 голосов
/ 27 марта 2011

Рассуждение идет как

  • SELECT максимальное количество голосов для каждого жанра
  • JOIN вернуться к исходной таблице, чтобы получить дополнительные столбцы для найденных записей.

Оператор SQL

SELECT  us.*
FROM    UserSongs us
        INNER JOIN (
          SELECT  fav_song_genre
                  , MAX(votes_as_fav_member) AS votes_as_fav_member
          FROM    UserSongs
          GROUP BY
                  fav_song_genre
        ) usm ON usm.fav_song_genre = us.fav_song_genre
                 AND usm.votes_as_fav_member = us.votes_as_fav_member

Редактировать

Как я могу убедиться, что человек с более низким ID возвращается

SELECT  MIN(us.user_id) as user_id
        , us.fav_song_genre
        , us.votes_as_fav_member
FROM    UserSongs us
        INNER JOIN (
          SELECT  fav_song_genre
                  , MAX(votes_as_fav_member) AS votes_as_fav_member
          FROM    UserSongs
          GROUP BY
                  fav_song_genre
        ) usm ON usm.fav_song_genre = us.fav_song_genre
                 AND usm.votes_as_fav_member = us.votes_as_fav_member
GROUP BY
        us.fav_song_genre
        , votes_as_fav_member
1 голос
/ 27 марта 2011

Не уверен, если это то, что вы спрашиваете:

SELECT g.fav_song_genre
     , t.user_id
     , g.most_votes
FROM yourTable t
  JOIN 
    ( SELECT fav_song_genre
           , MAX(votes_as_fav_member) as most_votes
      FROM yourTable
      GROUP BY fav_song_genre
    ) AS g
    ON t.fav_song_genre = g.fav_song_genre
      AND t.votes_as_fav_member= g.most_votes
;
1 голос
/ 27 марта 2011

Я создал таблицу и протестировал, и я думаю, что это также будет работать

Данные таблицы:

user_id fav_song_genre  votes_as_fav_member
1   hip_hop 3
2   hip_hop 5
3   rock    8
4   rock    6
5   blues   20
6   indie   18
7   rock    35
8   country 33
9   hip_hop 35
10  indie   5
11  blues   7
12  hip_hop 59
13  indie   187
14  classic 45
15  country 61
16  hip_hop 243

Запрос:

select t.user_id, t.fav_song_genre, t.votes_as_fav_member
from (
    select user_id, max(votes_as_fav_member) as max_votes, fav_song_genre 
    from table1 group by fav_song_genre
)
as x inner join table1 as t on t.votes_as_fav_member = x.max_votes and t.fav_song_genre = x.fav_song_genre;

Результаты:

user_id fav_song_genre  votes_as_fav_member
5   blues   20
7   rock    35
13  indie   187
14  classic 45
15  country 61
16  hip_hop 243
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...