Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Erhalten Sie die besten n Datensätze für jede Gruppe von gruppierten Ergebnissen

Hier ist eine Möglichkeit, dies zu tun, indem Sie UNION ALL verwenden (Siehe SQL Fiddle mit Demo ). Dies funktioniert mit zwei Gruppen, wenn Sie mehr als zwei Gruppen haben, müssen Sie die group angeben Nummer und fügen Sie Abfragen für jede group hinzu :

(
  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
)

Es gibt verschiedene Möglichkeiten, dies zu tun. Lesen Sie diesen Artikel, um die beste Route für Ihre Situation zu ermitteln:

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

Bearbeiten:

Dies könnte auch für Sie funktionieren, es generiert eine Zeilennummer für jeden Datensatz. Anhand eines Beispiels aus dem obigen Link werden nur die Datensätze mit einer Zeilennummer kleiner oder gleich 2 zurückgegeben:

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;

Siehe Demo