Även om du anger LIMIT 100, kommer denna typ av fråga att kräva att en fullständig skanning och tabell byggs upp, och sedan varje post inspekteras och rad numreras innan du slutligen filtrerar efter de 100 som du vill visa.
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;
Tillvägagångssättet här är
- Gruppera efter för att få NumSales
- Använd variabler för att radnummerera försäljningen per leverantör/produkt
- Filtrera den numrerade datamängden för att tillåta max 3 per leverantör
- Beställ återstående av NumSales DESC och returnera endast 100