2013-10-27 38 views
3

我有一個包含多個用戶記錄的表格,按日期排序。用戶的統計數據保存在那裏,併爲每個事件創建一個新條目。MySQL - 根據表中的名稱出現排名用戶;從名稱查找排名

我創建了取前10名用戶,基於發生的查詢:

SELECT * FROM (
    SELECT name, COUNT(*) AS occurrences 
    FROM users 
    GROUP BY name 
    ORDER BY occurrences DESC LIMIT 10 
) AS rank; 

它正確地報告所有的前10名用戶,並且次數每次出現。

但是,我會喜歡搜索某個用戶,它不僅會報告他出現的次數,還會報告他的總體排名。如果所有用戶都按發生次數排序,排名將是他在列表中的位置。

我一直在嘗試使用SELECT ROW_NUMBER(),但我總是得到無效的語法,不完全確定我做錯了什麼,不幸的是。我一直在嘗試隨機的東西,我一直在網上找到,但似乎沒有工作。

什麼是最好的方式來找到用戶的排名?只有一個查詢,如果可能的話。

感謝, 努諾

+0

看到這個答案,讓你開始:http://stackoverflow.com/ a/3614741/1385896 –

回答

3

根據我的評論鏈接的答案,我與它擺弄以及與此想出了:

SELECT * 
FROM (
    SELECT NAME, occurrences, @rownum := @rownum + 1 AS position 
    FROM (
    SELECT NAME, COUNT(*) AS occurrences 
    FROM users 
    GROUP BY NAME 
    ORDER BY occurrences DESC LIMIT 10 
    ) a 
    JOIN (
    SELECT @rownum := 0 
    ) r 
) b 
WHERE NAME = "bbb" 

該查詢返回的用戶,它基於的立場在COUNT上。

如果你只是想行列有序列表,只是刪除外選擇:

SELECT name,occurrences,@rownum := @rownum + 1 AS position 
FROM (
    SELECT name, COUNT(*) AS occurrences 
    FROM users 
    GROUP BY name 
    ORDER BY occurrences DESC LIMIT 10 
) a 
JOIN (SELECT @rownum := 0) r; 

sqlfiddle demo

+0

非常感謝,它工作。順便說一句,在第一個你有「:=」而不是「:=」,這會導致語法錯誤。 – Nuno