Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Obtenha os n principais registros para cada grupo de resultados agrupados


Aqui está uma maneira de fazer isso, usando UNION ALL (Consulte SQL Fiddle with Demo ). Isso funciona com dois grupos, se você tiver mais de dois grupos, precisará especificar o group número e adicionar consultas para cada 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
)

Existem várias maneiras de fazer isso, consulte este artigo para determinar a melhor rota para sua situação:

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

Editar:

Isso pode funcionar para você também, pois gera um número de linha para cada registro. Usando um exemplo do link acima, isso retornará apenas os registros com um número de linha menor ou igual a 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;

Veja Demonstração