2013-07-29 56 views
1

我有以下查询:MySQL的分组排名

SELECT @rn:[email protected]+1 AS rank, pet_name, pet_count 
FROM (
    SELECT pet_name, COUNT(*) AS pet_count 
    FROM pets 
    WHERE pet_breed="cat" 
    GROUP BY pet_name 
    ORDER BY pet_count DESC 
) t1, (SELECT @rn:=0) t2 

产生的输出是这样的:

1 Kitty 87 
2 Smokey 81 
3 Bella 80 
4 Oreo 63 
5 Charlie 63 
6 Tiger 62 
7 Lucy 62 
8 Jack 61 
9 Tigger 60 

的问题是,奥利奥和查理,老虎和露西应该因为他们的排名相同都是63所以结果看起来像

1 Kitty 87 
2 Smokey 81 
3 Bella 80 
4 Oreo 63 
4 Charlie 63 
5 Tiger 62 
5 Lucy 62 
6 Jack 61 
7 Tigger 60 

我只是不能弄清楚得到它的调整我想要的方式。

对此提出建议?

+0

请提供一些示例数据 –

回答

1
SELECT IF((@previous = pet_count, @rn, @rn:[email protected]+1) AS rank, pet_name, pet_count, @previous := pet_count 
FROM (
    SELECT pet_name, COUNT(*) AS pet_count 
    FROM pets 
    WHERE pet_breed="cat" 
    GROUP BY pet_name 
    ORDER BY pet_count DESC 
) t1, (SELECT @rn:=0) t2 

我没有在实际中尝试过。但概念将起作用

+0

这可以解决问题。 –

+0

太棒了!这解决了我稍微不同的问题,以及如果新组开始时,再次开始排名1。 – physicalattraction