簡體   English   中英

MySQL:查詢有領帶的排行榜

[英]MySQL: Querying a leaderboard with ties

我知道這是一個熱門話題,但我仍然沒有找到我想要的東西。 我想查詢一張表

BOOKS_READ
id
user_id
book_id

格式化列出已閱讀書籍最多的用戶的排行榜。 當用戶閱讀一本書時,與 book id 和 user 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 解決這些問題的方法:-)

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++;
}

?>

你要做的就是統計得分比你感興趣的記錄更好的人數,然后加 1。

所以,如果你是最好的玩家,零人的得分更高,所以 0 + 1 = #1 排名。

如果五個人的分數更高,不管他們中有多少人並列,你仍然是 5 + 1 = 6。

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

邊緣條件是您不知道結果集中的第一行是否與“他”之前的人並列。 因此,您需要知道有多少人與您的結果集中的第一個人得分相同。 (如果您從頂部開始,這不是問題。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM