Maison > base de données > tutoriel mysql > Comment classer les lignes dans MySQL en fonction de plusieurs colonnes ?

Comment classer les lignes dans MySQL en fonction de plusieurs colonnes ?

Susan Sarandon
Libérer: 2024-12-30 08:14:09
original
400 Les gens l'ont consulté

How to Rank Rows in MySQL Based on Multiple Columns?

Détermination du classement en fonction de plusieurs colonnes dans MySQL

Requête :

Pour classer les lignes en fonction sur plusieurs colonnes (user_id et game_id) en considérant l'ordre décroissant de game_detail_sum, vous pouvez utiliser une sous-requête et expressions CASE conditionnelles :

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 
Copier après la connexion

Explication :

  1. La sous-requête classe les lignes par ordre décroissant de game_detail_sum pour chaque user_id.
  2. La requête externe utilise les variables définies par l'utilisateur @r (rang de ligne) et @u (id_utilisateur précédent) pour attribuer une ligne nombres.

Requête améliorée avec la fonction Row_Number() MySQL 8 :

MySQL 8.0 introduit la fonction Row_Number(), qui permet une numérotation des lignes plus efficace :

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;
Copier après la connexion

Supplémentaire Notes :

  • Dans l'approche originale, l'utilisation de ORDER BY et des variables utilisateur dans la même requête peut ne pas garantir des résultats corrects en raison de l'ordre d'évaluation imprévisible de l'optimiseur.
  • L'amélioration La requête utilisant Row_Number() est plus performante et fournit des résultats prévisibles dans MySQL 8.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal