首頁 >資料庫 >mysql教程 >MySQL中如何根據多列對使用者進行排名?

MySQL中如何根據多列對使用者進行排名?

DDD
DDD原創
2024-12-29 09:45:10254瀏覽

How to Rank Users Based on Multiple Columns in MySQL?

在 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn