2011-08-16 36 views
4

我知道這是一個熱門話題,但我仍然沒有找到我正在尋找的東西。我想查詢一個表格MySQL:查詢領帶排行榜

BOOKS_READ 
id 
user_id 
book_id 

要格式化已經閱讀最多書籍的用戶的排行榜。當用戶閱讀書籍時,與書籍ID和用戶ID匹配的記錄將被登錄到books_read表中。

是否可以對此查詢的結果進行排序,從1開始並考慮關係?

SELECT user_id, COUNT(*) AS book_count 
FROM books_read 
GROUP BY user_id 
ORDER BY book_count DESC LIMIT 10 

如果出現平局,我想在結果中列出'='符號。

例如,

rank user_id book_count 
=1 30  121 
=1 17  121 
2 101  119 
=3 11  104 
=3 91  104 

非常感謝您的幫助!我不介意使用PHP來處理一些吧,但我在學習直SQL解決這些各種各樣的事情:-)

+2

第一次不會30和17並列,第101次會得到第3次,第11次和第91次並列嗎? – cdhowie

回答

2
SELECT GROUP_CONCAT(user_id, book_count 
FROM (
    SELECT user_id, COUNT(*) AS book_count 
    FROM books_read 
    GROUP BY user_id 
    ORDER BY book_count DESC 
) AS T1 
GROUP BY book_count 
ORDER BY book_count 

給你

user_id book_count 
30,17  121 
101   119 
11,91  104 

很感興趣,你然後可以使用PHP來解析關係。

<?php 
$rank = 1; 

while ($row = mysql_fetch_assoc($result)) { 
    $users = explode(',', $row['user_id']; 
    foreach ($users as $user) { 
     echo 'Rank: ' . $rank . ' ' . $user . "\n; 
    } 
    $rank++; 
} 

?> 
+0

雖然這個工作,我認爲這有點麻煩。您可以輕鬆使用OP的原始查詢,並在php中記錄得分,並在得分與前一行相同時減少$ rank,並在之後增加2。從而在行迭代中也不需要使用「foreach」循環。 –

1

你想要做什麼是算誰比你所感興趣的記錄更好的成績的人數,並添加1

所以,如果你是最好的球員,零人有更好的分數,所以0 + 1 = 1排名。

如果五人有更好的成績,不管有多少人互相捆綁的,你還是5 + 1 = 6

的問題是,這是一種昂貴的查詢做的爲你顯示的每一行。因此,您可能希望爲結果集中的第一行執行此操作,然後在您的表示層(PHP)中爲每個人添加一個。當你這樣做的時候一定要考慮關係。

而邊緣條件是,您不知道結果集中的第一行是否與「他」之前的人相關聯。因此,您需要知道有多少人與結果集中的第一個人具有相同的分數。 (如果你是從頂部開始,這不是問題。)