2014-05-13 93 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 

請注意,在這種情況下,等級也不會是連續的,和幾個車型將有同一年級。