Meskipun Anda menentukan LIMIT 100, jenis kueri ini akan memerlukan pemindaian penuh dan tabel untuk dibuat, kemudian setiap record diperiksa dan diberi nomor baris sebelum akhirnya memfilter 100 yang ingin Anda tampilkan.
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;
Pendekatannya di sini adalah
- Kelompokkan menurut untuk mendapatkan NumSales
- Gunakan variabel untuk memberi nomor baris penjualan per vendor/produk
- Filter kumpulan data bernomor untuk memungkinkan maksimal 3 per vendor
- Pesan sisanya dengan NumSales DESC dan kembalikan hanya 100