Mysql
 sql >> база данни >  >> RDS >> Mysql

Вземете топ n записа за всяка група групирани резултати

Ето един начин да направите това, като използвате UNION ALL (Вижте SQL Fiddle с демонстрация ). Това работи с две групи, ако имате повече от две групи, тогава ще трябва да посочите group номер и добавете заявки за всяка 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
)

Има различни начини да направите това, вижте тази статия, за да определите най-добрия маршрут за вашата ситуация:

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

Редактиране:

Това може да работи и за вас, генерира номер на ред за всеки запис. Използвайки пример от връзката по-горе, това ще върне само онези записи с номер на ред, по-малък или равен на 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;

Вижте Демо



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Изявление VALUES в MySQL

  2. Как да отмените завъртане на таблицата в MySQL

  3. Не мога да накарам формата си за вход, за да се свържа, да взаимодейства правилно с mySQL базата данни

  4. Успешни стратегии за архивиране и възстановяване на MySQL/MariaDB

  5. Генерирайте целочислена последователност в MySQL