Maison  >  Article  >  base de données  >  Comment générer des numéros de ligne au sein de groupes dans MySQL ?

Comment générer des numéros de ligne au sein de groupes dans MySQL ?

DDD
DDDoriginal
2024-11-11 17:45:02942parcourir

How to Generate Row Numbers Within Groups in MySQL?

Numéro de ligne dans les groupes dans MySQL

Problème :

Produire une requête MySQL pour générer un numéro de ligne pour chaque groupe d'enregistrements basés sur deux champs, tels que crew_id et type. Le numéro de ligne doit être réinitialisé pour chaque nouvelle combinaison de crew_id et de type.

Exemples de données :

id   crew_id   amount    type
 1      4       1000      AUB
 2      4       1500      AUB
 3      5       8000      CA
 4      4       1000      CA
 5      5       1000      AUB
 6      6       3000      AUB
 7      4       2000      CA
 8      6       3500      AUB
 9      4       5000      AUB
 10     5       9000      CA
 11     5       1000      CA

Sortie souhaitée :

id    crew_id   amount   type    row_number
 1      4       1000      AUB        1    
 2      4       1500      AUB        2 
 9      4       5000      AUB        3
 4      4       1000      CA         1
 7      4       2000      CA         2
 5      5       1000      AUB        1
 3      5       8000      CA         1
 10     5       9000      CA         2
 11     5       1000      CA         3
 6      6       3000      AUB        1
 6      6       3000      AUB        2

Solution :

Pour obtenir les numéros de ligne souhaités, nous pouvons utiliser une combinaison d'une sous-requête et d'une instruction CASE :

SELECT    id,
          crew_id,
          amount,
          type,
         ( 
            CASE type 
            WHEN @curType 
            THEN @curRow := @curRow + 1 
            ELSE @curRow := 1 AND @curType := type END
          ) + 1 AS rank
FROM      Table1 p,
          (SELECT @curRow := 0, @curType := '') r
ORDER BY  crew_id,type asc;

Dans cette requête :

  • La sous-requête (SELECT @curRow := 0, @curType := '') r initialise deux variables définies par l'utilisateur : @curRow à 0 et @curType à une chaîne vide.
  • L'instruction CASE dans la requête SELECT externe compare la colonne de type avec @curType pour déterminer si la ligne actuelle appartient au même groupe.

    • Si le type est égal à @curType, @curRow est incrémenté de 1.
    • Si le type diffère de @curType, @curRow est réinitialisé à 1 et @curType est mis à jour avec la valeur de type actuelle.
  • La valeur calculée est ensuite ajoutée à 1 pour produire le numéro de ligne.
  • L'ensemble de résultats est classé par crew_id et saisi par ordre croissant.

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!

Déclaration:
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