Mysql
 sql >> Base de données >  >> RDS >> Mysql

Obtenir les n meilleurs enregistrements pour chaque groupe de résultats groupés

Voici une façon de le faire, en utilisant UNION ALL (Voir SQL Fiddle avec démo ). Cela fonctionne avec deux groupes, si vous avez plus de deux groupes, vous devrez alors spécifier le group numéroter et ajouter des requêtes pour chaque 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 de procéder, consultez cet article pour déterminer le meilleur itinéraire pour votre situation :

http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/

Modifier :

Cela peut également fonctionner pour vous, il génère un numéro de ligne pour chaque enregistrement. En utilisant un exemple du lien ci-dessus, cela renverra uniquement les enregistrements avec un numéro de ligne inférieur ou égal à 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