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