在 MySQL 中根據多列確定排名
在 MySQL 中處理資料時,通常需要根據特定標準。在本例中,任務涉及根據使用者 ID 和遊戲 ID 對使用者進行排名,排名按照遊戲詳細資料的降序排列。
為了解決這個問題,我們將使用子查詢對資料進行排序,例如具有相同使用者 ID 的所有行都分組在一起,並根據遊戲詳細資訊按降序在它們之間進一步排序。然後,我們將使用條件 CASE..WHEN 表達式來計算行編號並分配使用者遊戲排名。
以下 SQL 查詢提供了解決方案:
SET @r := 0, @u := 0; SELECT @r := CASE WHEN @u = dt.user_id THEN @r + 1 WHEN @u := dt.user_id /* Notice := instead of = */ THEN 1 END AS user_game_rank, dt.user_id, dt.game_detail, dt.game_id FROM ( SELECT user_id, game_id, game_detail FROM game_logs ORDER BY user_id, game_detail DESC ) AS dt
在查詢中,我們使用使用者定義的變數@r和@u來追蹤行排名和使用者ID。我們確保對 user_game_rank 的評估和分配給 @u 的使用者 ID 發生在同一表達式中,以保持其正確的順序。
此查詢的結果將提供所需的使用者遊戲排名:
| user_game_rank | user_id | game_detail | game_id | | -------------- | ------- | ----------- | ------- | | 1 | 6 | 260 | 11 | | 2 | 6 | 100 | 10 | | 1 | 7 | 1200 | 10 | | 2 | 7 | 500 | 11 | | 3 | 7 | 260 | 12 | | 4 | 7 | 50 | 13 |
對於 MySQL 8.0 及以上版本,更有效率的做法是使用 Row_Number()函數,該函數可以直接根據指定的行排名計算criteria:
SELECT user_id, game_id, game_detail, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY game_detail DESC) AS user_game_rank FROM game_logs ORDER BY user_id, user_game_rank;
此查詢將提供與前一個查詢相同的輸出,但它提供了改進的性能,並且是MySQL 8.0 中行排名的推薦方法。
以上是MySQL中如何根據多列對使用者進行排名?的詳細內容。更多資訊請關注PHP中文網其他相關文章!