Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

एकाधिक टेबल जॉइन के साथ शीर्ष एन प्रति समूह

भले ही आप 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;

यहाँ दृष्टिकोण है

  1. NumSales पाने के लिए इसके अनुसार समूह बनाएं
  2. प्रति विक्रेता/उत्पाद की बिक्री को पंक्तिबद्ध करने के लिए चर का उपयोग करें
  3. प्रति विक्रेता अधिकतम 3 की अनुमति देने के लिए क्रमांकित डेटासेट को फ़िल्टर करें
  4. शेष को NumSales DESC द्वारा ऑर्डर करें और केवल 100 लौटाएं


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PHP अजगर के माध्यम से mysql से कनेक्ट नहीं हो सकता

  2. PHP के mysql_real_escape_string () के लिए जावा समकक्ष

  3. MySQL निष्पादित वापसी कोई क्यों नहीं करेगा?

  4. ऑपरेंड में 1 कॉलम होना चाहिए - MySQL NOT IN

  5. MySQL - सम्मिलित त्रुटि पर ध्यान न दें:डुप्लिकेट प्रविष्टि