Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Sử dụng LIMIT trong GROUP BY để nhận N kết quả cho mỗi nhóm?

Bạn có thể sử dụng GROUP_CONCAT hàm tổng hợp để lấy tất cả các năm vào một cột duy nhất, được nhóm theo id và đặt hàng theo rate :

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

Kết quả:

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

Và sau đó, bạn có thể sử dụng FIND_IN_SET , trả về vị trí của đối số đầu tiên bên trong đối số thứ hai, ví dụ:

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

Sử dụng kết hợp GROUP_CONCATFIND_IN_SET và lọc theo vị trí được trả về bởi find_in_set, sau đó bạn có thể sử dụng truy vấn này chỉ trả về 5 năm đầu tiên cho mọi id:

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;

Vui lòng xem fiddle tại đây .

Xin lưu ý rằng nếu nhiều hàng có thể có cùng tỷ lệ, bạn nên cân nhắc sử dụng GROUP_CONCAT (DISTINCT tỷ lệ ĐẶT HÀNG THEO tỷ lệ) trên cột tỷ lệ thay vì cột năm.

Độ dài tối đa của chuỗi do GROUP_CONCAT trả về bị giới hạn, do đó, điều này hoạt động tốt nếu bạn cần chọn một vài bản ghi cho mọi nhóm.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mối quan hệ giữa danh mục, lược đồ, người dùng và phiên bản cơ sở dữ liệu

  2. LỖI 1396 (HY000):Thao tác CREATE USER không thành công cho 'jack' @ 'localhost'

  3. Có bao nhiêu hàng trong cơ sở dữ liệu QUÁ NHIỀU?

  4. Làm thế nào để xử lý lỗi cho các mục nhập trùng lặp?

  5. Làm thế nào để khắc phục các sự cố thường gặp với cơ sở dữ liệu MySQL?