2012-10-18 58 views
2

我有一個帶有id和值的表。 我怎樣才能按desc的值排序表中的一個元素? 我想要做的是:我如何使用SQL做排名

SELECT id FROM table ORDER BY value DESC 

,我想它告訴我的id爲例位置= 4個

非常感謝回答!

回答

2

MySQL沒有分析功能,所以你必須使用user variables

SELECT @r:[email protected]+1 AS rank, id 
FROM  table, (SELECT @r:=0) init 
ORDER BY value DESC 

爲了得到一個特定的記錄的等級,包裝在一個外部查詢:

SELECT rank FROM (
    SELECT @r:[email protected]+1 AS rank, id 
    FROM  table, (SELECT @r:=0) init 
    ORDER BY value DESC 
) t WHERE id = 4 

要保存MySQL從表中不必要地計算的排名記錄,你可以添加一個過濾器:

SELECT rank FROM (
    SELECT @r:[email protected]+1 AS rank, table.id 
    FROM  table, 
      (SELECT value FROM table WHERE id=4) t, 
      (SELECT @r:=0) init 
    WHERE table.value >= t.value 
    ORDER BY table.value DESC 
) t WHERE id = 4 
+0

謝謝您的回答@eggyal,所以在PHP我應該做的: $測試= $ bdd->查詢(「SELECT @r:= @ R + 1秩,id FROM table,(SELECT @r:= 0)init ORDER BY value DESC'); $ tk = $ test-> fetch(); echo''。 $ tk [@r]。 ''; – woshitom

+0

@ user1754181:是的,您可以這樣做(但由於別名,結果集中的列名將是「rank」,而不是「@ r」)。但是如果你不需要SQL中的rank值,你可以簡單地生成它,同時在PHP中循環結果集並節省你所有的大驚小怪。 – eggyal

+0

我試過了,但它告訴我「使用未定義的常量等級 - 假定'等級'」 – woshitom

1

Eggyal的解決方案不是rank,而是row_number(這些實際上有意義,因爲它們是SQL標準的一部分)。

我認爲有以下做MySQL中的dense_rank

SELECT @r:[email protected]+1 AS rank, id 
FROM  (select id, count(*) as cnt 
      from table t 
      group by id 
     ), 
     (SELECT @r:=0) init 
ORDER BY value DESC 

一個rank是有點困難。 。 。我想下面的工作:

SELECT @r:[email protected]+1-offset AS rank, id 
FROM  (select id, count(*) as cnt 
      from table t 
      group by id 
     ), 
     (SELECT @r:=0, count(*)-1 as offset 
      from table t 
      group by id 
      order by count(*) desc 
      limit 1 
     ) init 
ORDER BY value DESC 
+0

非常好的一點! +1 – eggyal

+0

非常感謝@Gordon Linoff,但我仍然不知道該怎麼做才能獲得id = 4的排名? – woshitom