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

N hàng đầu trên mỗi nhóm với nhiều bảng tham gia

Ngay cả khi bạn chỉ định LIMIT 100, loại truy vấn này sẽ yêu cầu quét toàn bộ và tạo bảng, sau đó mọi bản ghi được kiểm tra và đánh số hàng trước khi lọc 100 mà bạn muốn hiển thị.

select
    vendorid, productid, NumSales
from
(
    select
        vendorid, productid, NumSales,
        @r := IF(@g=vendorid,@r+1,1) RowNum,
        @g := vendorid
    from (select @g:=null) initvars
    CROSS JOIN 
    (
        SELECT COUNT(oi.price) AS NumSales, 
               p.productid, 
               p.vendorid
        FROM products p
        INNER JOIN vendors v ON (p.vendorid = v.vendorid)
        INNER JOIN orders_items oi ON (p.productid = oi.productid)
        INNER JOIN orders o ON (oi.orderid = o.orderid)
        WHERE (p.Approved = 1 AND p.Active = 1 AND p.Deleted = 0)
        AND (v.Approved = 1 AND v.Active = 1 AND v.Deleted = 0)
        AND o.`Status` = 'SETTLED'
        AND o.Deleted = 0
        GROUP BY p.vendorid, p.productid
        ORDER BY p.vendorid, NumSales DESC
    ) T
) U
WHERE RowNum <= 3
ORDER BY NumSales DESC
LIMIT 100;

Cách tiếp cận ở đây là

  1. Nhóm theo nhóm để nhận NumSales
  2. Sử dụng các biến để đánh số hàng bán cho mỗi nhà cung cấp / sản phẩm
  3. Lọc tập dữ liệu được đánh số để cho phép tối đa 3 cho mỗi nhà cung cấp
  4. Đặt hàng số còn lại của NumSales DESC và chỉ trả lại 100 chiếc


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách triển khai máy chủ Percona cho MySQL để có tính khả dụng cao

  2. Làm cách nào để kết nối với MySQL DB đang chạy dưới dạng vùng chứa trong docker?

  3. PHP 7.0 và lỗi khởi động MySQL ký hiệu không xác định:mysqlnd_allocator in Unknown

  4. Làm cách nào để hiển thị hàng bảng mysql dưới dạng cột

  5. Nhóm theo năm trong trường ngày trong MySQL