Rumah >pangkalan data >tutorial mysql >Bagaimana Kedudukan Pengguna Berdasarkan Berbilang Lajur dalam MySQL?

Bagaimana Kedudukan Pengguna Berdasarkan Berbilang Lajur dalam MySQL?

DDD
DDDasal
2024-12-29 09:45:10254semak imbas

How to Rank Users Based on Multiple Columns in MySQL?

Menentukan Kedudukan Berdasarkan Berbilang Lajur dalam MySQL

Apabila bekerja dengan data dalam MySQL, selalunya perlu untuk menentukan pangkat berdasarkan baris pada kriteria tertentu. Dalam kes ini, tugas itu melibatkan kedudukan pengguna berdasarkan kedua-dua ID pengguna dan ID permainan, dengan kedudukan disusun dalam susunan menurun bagi butiran permainan.

Untuk menangani masalah ini, kami akan menggunakan subkueri untuk memesan data seperti bahawa semua baris dengan ID pengguna yang sama dikumpulkan bersama, dengan pengisihan selanjutnya antara baris tersebut berdasarkan butiran permainan dalam tertib menurun. Kemudian, kami akan menggunakan CASE bersyarat..WHEN ungkapan untuk menilai penomboran baris dan menetapkan kedudukan permainan pengguna.

Pertanyaan SQL berikut menyediakan penyelesaian:

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 

Dalam pertanyaan, kami menggunakan pembolehubah takrif pengguna @r dan @u untuk menjejak kedudukan baris dan ID pengguna. Kami memastikan bahawa penilaian peringkat_permainan_pengguna dan penetapan ID pengguna kepada @u berlaku dalam ungkapan yang sama untuk mengekalkan susunan yang betul.

Hasil pertanyaan ini akan memberikan kedudukan permainan pengguna seperti yang dikehendaki:

| 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      |

Untuk MySQL 8.0 dan ke atas, pendekatan yang lebih cekap ialah menggunakan fungsi Row_Number(), yang boleh mengira secara terus kedudukan baris berdasarkan yang ditentukan kriteria:

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;

Pertanyaan ini akan memberikan output yang sama seperti yang sebelumnya, tetapi ia menawarkan prestasi yang lebih baik dan merupakan kaedah yang disyorkan untuk kedudukan baris dalam MySQL 8.0.

Atas ialah kandungan terperinci Bagaimana Kedudukan Pengguna Berdasarkan Berbilang Lajur dalam MySQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn