भले ही आप LIMIT 100 निर्दिष्ट करते हैं, इस प्रकार की क्वेरी के लिए एक पूर्ण स्कैन और तालिका बनाने की आवश्यकता होगी, फिर प्रत्येक रिकॉर्ड का निरीक्षण किया जाएगा और अंत में उस 100 को फ़िल्टर करने से पहले पंक्तिबद्ध किया जाएगा जिसे आप प्रदर्शित करना चाहते हैं।
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;
यहाँ दृष्टिकोण है
- NumSales पाने के लिए इसके अनुसार समूह बनाएं
- प्रति विक्रेता/उत्पाद की बिक्री को पंक्तिबद्ध करने के लिए चर का उपयोग करें
- प्रति विक्रेता अधिकतम 3 की अनुमति देने के लिए क्रमांकित डेटासेट को फ़िल्टर करें
- शेष को NumSales DESC द्वारा ऑर्डर करें और केवल 100 लौटाएं