2014-05-13 70 views
1

我有一个MySQL查询,我想在其中添加rank列。根据列获取排名

SELECT AM.* , count(ALM.id) as likes FROM admin_models as AM 
      left join admin_liked_models as ALM on AM.id = ALM.admin_model_id 
      group by AM.id 

admin_modelsadmin_liked_models有一对多的关系。

最高likes应以秩1

任何人都可以点我如何做到这一点?谢谢!

回答

1

不幸的是,MySQL不支持Row_Number()或其他分析功能。下面是产生相同结果的方法之一:

SELECT *, 
    @rn:[email protected]+1 rn 
FROM (
    SELECT AM.* , count(ALM.id) as likes 
    FROM admin_models as AM 
      LEFT JOIN admin_liked_models as ALM ON AM.id = ALM.admin_model_id 
    GROUP BY AM.id 
) t, (SELECT @rn:=0) t2 
ORDER BY likes DESC 

您可能不需要子查询,但我只是显示分隔。

+0

这只适用于使用'ORDER BY'时是否可以根据'likes'列的数量制作'rank'列? – galao

+0

@galao - 这确实通过订购喜欢的数量来创建排名栏。我不认为你可以创建一个没有排序的列,如果没有,排名是什么。也许我不理解你的问题,但你仅限于你的RDBMS。 – sgeddes

0

这只适用于与ORDER BY一起使用是不可能根据喜欢的列的数量作出排名列?

看起来你不是在寻找rank。如果你不希望使用ORDER并希望使用等级为一些等级,你可以尝试这样的事:

SELECT AM.* , count(ALM.id) as likes, 

((SELECT max(maxval) from 
    (SELECT count(ALM.id) as maxval FROM admin_models as AM 
     left join admin_liked_models as ALM on AM.id = ALM.admin_model_id 
     group by AM.id) as subq) - count(ALM.id) + 1) as rank 

FROM admin_models as AM 
     left join admin_liked_models as ALM on AM.id = ALM.admin_model_id 
     group by AM.id 

请注意,在这种情况下,等级也不会是连续的,和几个车型将有同一年级。