Oto jeden ze sposobów, aby to zrobić, używając UNION ALL
(Zobacz SQL Fiddle z wersją demonstracyjną
). Działa to z dwiema grupami, jeśli masz więcej niż dwie grupy, musisz określić group
numerować i dodawać zapytania dla każdej 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
)
Można to zrobić na wiele sposobów, zapoznaj się z tym artykułem, aby określić najlepszą trasę w Twojej sytuacji:
http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/
Edycja:
To może zadziałać również dla Ciebie, generuje numer wiersza dla każdego rekordu. Korzystając z przykładu z powyższego linku, zwróci to tylko te rekordy z numerem wiersza mniejszym lub równym 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;
Zobacz Demo