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