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

Използвате ли LIMIT в рамките на GROUP BY, за да получите N резултата на група?

Можете да използвате GROUP_CONCAT агрегирана функция за събиране на всички години в една колона, групирана по id и подредени по rate :

SELECT   id, GROUP_CONCAT(year ORDER BY rate DESC) grouped_year
FROM     yourtable
GROUP BY id

Резултат:

-----------------------------------------------------------
|  ID | GROUPED_YEAR                                      |
-----------------------------------------------------------
| p01 | 2006,2003,2008,2001,2007,2009,2002,2004,2005,2000 |
| p02 | 2001,2004,2002,2003,2000,2006,2007                |
-----------------------------------------------------------

И тогава можете да използвате FIND_IN_SET , което връща позицията на първия аргумент във втория, напр.

SELECT FIND_IN_SET('2006', '2006,2003,2008,2001,2007,2009,2002,2004,2005,2000');
1

SELECT FIND_IN_SET('2009', '2006,2003,2008,2001,2007,2009,2002,2004,2005,2000');
6

Използване на комбинация от GROUP_CONCAT и FIND_IN_SET и филтриране по позицията, върната от find_in_set, можете да използвате тази заявка, която връща само първите 5 години за всеки идентификатор:

SELECT
  yourtable.*
FROM
  yourtable INNER JOIN (
    SELECT
      id,
      GROUP_CONCAT(year ORDER BY rate DESC) grouped_year
    FROM
      yourtable
    GROUP BY id) group_max
  ON yourtable.id = group_max.id
     AND FIND_IN_SET(year, grouped_year) BETWEEN 1 AND 5
ORDER BY
  yourtable.id, yourtable.year DESC;

Моля, вижте цигулка тук .

Моля, имайте предвид, че ако повече от един ред могат да имат една и съща скорост, трябва да помислите за използването на GROUP_CONCAT(DISTINCT rate ORDER BY rate) в колоната за тарифа вместо в колоната за годината.

Максималната дължина на низа, върнат от GROUP_CONCAT, е ограничена, така че това работи добре, ако трябва да изберете няколко записа за всяка група.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да намеря местоположението на MySQL my.cnf

  2. Как да намерите разлика между две дати в MySQL

  3. Как да добавите разделител към конкатениран низ в MySQL – CONCAT_WS()

  4. Как да изтрия mysql ред след изтичане на времето?

  5. Създайте динамична mysql заявка с помощта на php променливи