[英]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.