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

Nhóm MySQL Theo với số N hàng đầu của mỗi loại

SELECT  mo.Letter, md.Rank
FROM    (
        SELECT  DISTINCT letter
        FROM    mytable
        ) mo
JOIN    mytable md
ON      md.Letter >= mo.Letter
        AND md.Letter <= mo.Letter
        AND Rank <=
        COALESCE
                (
                (
                SELECT  Rank
                FROM    mytable mi
                WHERE   mi.letter = mo.letter
                ORDER BY
                        Rank
                LIMIT 1, 1
                ),
                0xFFFFFFFF
                )

Bạn cần có một chỉ mục tổng hợp trên (Letter, Rank) (theo thứ tự này)

Lưu ý cấu trúc này:

md.Letter >= mo.Letter
AND md.Letter <= mo.Letter

thay vì chỉ md.Letter = mo.Letter

Nó buộc Range checked for each record hiệu quả hơn.

Xem bài viết này trong blog của tôi:

để biết thêm chi tiết về điều này.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào tồi tệ bằng cách sử dụng SELECT MAX (id) trong MYSQL thay vì mysql_insert_id () trong PHP?

  2. Xử lý các khóa chính trùng lặp khi chèn trong SQLAlchemy (kiểu khai báo)

  3. MySQL 8.0 - Máy khách không hỗ trợ giao thức xác thực do máy chủ yêu cầu; xem xét nâng cấp máy khách MySQL

  4. Làm thế nào để tách chuỗi bản ghi được phân tách bằng dấu phẩy và sắp xếp sau đó tuần tự trong MySQL?

  5. Bí ẩn của MySQL:Giá trị rỗng không khác với chuỗi không rỗng