Maison >base de données >tutoriel mysql >Comment extraire efficacement les N premiers enregistrements de données groupées ?
Extraire efficacement les meilleurs enregistrements dans des données groupées
Supposons qu'il existe un ensemble de données structurées contenant des colonnes telles que la personne, le groupe et l'âge. Cet article explique comment obtenir les N premiers individus de chaque groupe en fonction de l'âge.
Résultats attendus :
Le but est de récupérer les deux individus les plus âgés de chaque groupe, triés par ordre alphabétique de nom s'ils ont le même âge.
Solutions existantes :
L'approche précédente (inspirée de la requête proposée par @Bohemian) récupère une seule ligne de premier niveau pour chaque groupe :
<code class="language-sql">select * from (select * from mytable order by `Group`, Age desc, Person) x group by `Group`</code>
Solution améliorée utilisant UNION :
Une façon d'étendre cette fonctionnalité est d'utiliser l'opérateur UNION ALL, pouvant ainsi récupérer un nombre spécifié d'enregistrements pour chaque groupe :
<code class="language-sql">( select * from mytable where `group` = 1 order by age desc LIMIT 2 ) UNION ALL ( select * from mytable where `group` = 2 order by age desc LIMIT 2 )</code>
Une alternative à l'utilisation des numéros de ligne :
Une autre approche consiste à générer un numéro de ligne pour chaque enregistrement puis à filtrer en fonction de ce numéro de ligne :
<code class="language-sql">select person, `group`, age from ( select person, `group`, age, (@num:=if(@group = `group`, @num +1, if(@group := `group`, 1, 1))) row_number from test t CROSS JOIN (select @num:=0, @group:=null) c order by `Group`, Age desc, person ) as x where x.row_number <= 2;</code>
Conclusion :
En fonction des exigences spécifiques et des caractéristiques des données, les techniques de numérotation UNION et de ligne fournissent des solutions efficaces pour récupérer des enregistrements de niveau supérieur dans des résultats groupés.
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!