Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Uzyskaj pierwsze n rekordów dla każdej grupy zgrupowanych wyników

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. BŁĄD 2003 (HY000):Nie można połączyć się z serwerem MySQL na „127.0.0.1” (111)

  2. Kod błędu MySQL:1175 podczas UPDATE w MySQL Workbench

  3. Jak połączyć się ze źródłem danych MySQL w Visual Studio

  4. SQL Server odpowiednik funkcji substring_index w MySQL

  5. Naprawianie uszkodzonego kodowania UTF-8