sql >> Database teknologi >  >> RDS >> Mysql

Få top n poster for hver gruppe af grupperede resultater

Her er en måde at gøre dette på ved at bruge UNION ALL (Se SQL Fiddle with Demo ). Dette fungerer med to grupper, hvis du har mere end to grupper, skal du angive group nummer og tilføj forespørgsler for hver 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
)

Der er en række måder at gøre dette på. Se denne artikel for at finde den bedste rute for din situation:

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

Rediger:

Dette fungerer muligvis også for dig, det genererer et rækkenummer for hver post. Ved at bruge et eksempel fra linket ovenfor vil dette kun returnere de poster med et rækkenummer på mindre end eller lig med 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;

Se demo



  1. Migrering af MySQL til PostgreSQL på AWS RDS, del 4

  2. Tabelprøve og andre metoder til at få tilfældige tuples

  3. Hvorfor opstod der en netværksrelateret eller instansspecifik fejl under oprettelse af en forbindelse til SQL Server?

  4. Forbedring af vores online jobportal-datamodel