Maison > Questions et réponses > le corps du texte
J'ai reçu une bonne réponse spécifique à MySQL de la part de @Bohemian : </p> <pre class="brush:php;toolbar:false;">sélectionner * de (sélectionnez * dans mytable, commandez par « Groupe », âge, personne) x regrouper par `Group`</pre> <p>Ce serait bien de pouvoir s'appuyer sur cela, mais je ne vois pas comment. </p>
P粉3402642832023-08-22 19:25:52
Dans d'autres bases de données, vous pouvez utiliser ROW_NUMBER
来实现此功能。MySQL不支持ROW_NUMBER
mais vous pouvez le simuler à l'aide de variables :
SELECT person, groupname, age FROM ( SELECT person, groupname, age, @rn := IF(@prev = groupname, @rn + 1, 1) AS rn, @prev := groupname FROM mytable JOIN (SELECT @prev := NULL, @rn := 0) AS vars ORDER BY groupname, age DESC, person ) AS T1 WHERE rn <= 2
Démo en ligne : sqlfiddle
EDIT Je viens de remarquer que bluefeet a posté une réponse très similaire : +1 pour lui. Mais cette réponse présente deux petits avantages :
Je le garde donc au cas où cela aiderait quelqu'un.
P粉4045397322023-08-22 13:19:02
Voici une façon d'ajouter une requête en utilisant UNION ALL
(请参见带有演示的SQL Fiddle)。这适用于两个组,如果你有多个组,则需要指定group
编号并为每个group
:
( 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 )
Il existe plusieurs façons d'y parvenir, veuillez vous référer à cet article pour déterminer la meilleure méthode selon votre situation :
http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/
Éditeur :
Cela peut fonctionner pour vous aussi, cela génère un numéro de ligne pour chaque enregistrement. En utilisant l'exemple du lien ci-dessus, il ne renverra que les enregistrements dont les numéros de ligne sont inférieurs ou égaux à 2 :
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;
Voir Démo