MySQL:获取组的最大值

时间:2011-03-27 09:31:31

标签: mysql sql

我有一张桌子:

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

我如何只获得每组最高votes_as_fav_member的user_id结果fav_song_genre:

这样的东西
SELECT *, MAX(votes_as_fav_member) as most_votes 
FROM   table 
GROUP BY 
       fav_song_genre

我正在使用它,但它没有给我每个类型投票最多的成员的ID。

4 个答案:

答案 0 :(得分:5)

这不是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

查询应返回哪个ID?它应该只返回一个吗?或所有票数相同的人?

因此,如果您只需要一个ID,那么抽奖的区别是什么?

Lieven在几秒钟内打败了我的SQL分辨率。

答案 1 :(得分:4)

推理就像

    每种类型
  • 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

答案 2 :(得分:1)

我创建了表并进行了测试,我认为这也会起作用
表数据:

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

答案 3 :(得分:1)

不确定这是不是你问的问题:

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
;