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

प्रश्न:प्रति आइटम एकाधिक समुच्चय गिनें

यहाँ एक तरकीब है:एक SUM() की गणना करना 1 या 0 के रूप में जाने जाने वाले मानों की संख्या COUNT() . के बराबर है उन पंक्तियों में जहां मान 1 है। और आप जानते हैं कि एक बूलियन तुलना 1 या 0 (या NULL) लौटाती है।

SELECT c.catname, COUNT(m.catid) AS item_count,
  SUM(i.ownerid = @ownerid) AS owner_item_count
FROM categories c
  LEFT JOIN map m USING (catid)
  LEFT JOIN items i USING (itemid)
GROUP BY c.catid;

बोनस प्रश्न के लिए, आप बाहरी जुड़ाव के बजाय केवल एक आंतरिक जुड़ाव कर सकते हैं, जिसका अर्थ केवल map में कम से कम एक पंक्ति वाली श्रेणियां होंगी। लौटा दिया जाएगा।

SELECT c.catname, COUNT(m.catid) AS item_count,
  SUM(i.ownerid = @ownerid) AS owner_item_count
FROM categories c
  INNER JOIN map m USING (catid)
  INNER JOIN items i USING (itemid)
GROUP BY c.catid;

यहां एक और समाधान है, जो उतना कुशल नहीं है, लेकिन मैं इसे यह समझाने के लिए दिखाऊंगा कि आपको त्रुटि क्यों मिली:

SELECT c.catname, COUNT(m.catid) AS item_count,
  SUM(i.ownerid = @ownerid) AS owner_item_count
FROM categories c
  LEFT JOIN map m USING (catid)
  LEFT JOIN items i USING (itemid)
GROUP BY c.catid
HAVING item_count > 0;

आप WHERE . में कॉलम एलियासेस का उपयोग नहीं कर सकते खंड, क्योंकि WHERE . में भाव क्लॉज का मूल्यांकन चयन-सूची में भावों से पहले किया जाता है। दूसरे शब्दों में, चयन-सूची अभिव्यक्तियों से जुड़े मान अभी तक उपलब्ध नहीं हैं।

आप GROUP BY . में कॉलम एलियासेस का उपयोग कर सकते हैं , HAVING , और ORDER BY खंड। चयन-सूची में सभी भावों का मूल्यांकन किए जाने के बाद ये खंड चलाए जाते हैं।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL डेटा क्वेरी से XML फ़ाइल कैसे बनाएं?

  2. एकल क्वेरी के साथ mysql तालिका में सभी माता-पिता ढूँढना (पुनरावर्ती क्वेरी)

  3. चेतावनी समस्या:पैरामीटर 1 को mysqli_result होने की अपेक्षा करता है

  4. फ्रीबेस में सभी संबंधित अभिनेताओं को पुनः प्राप्त/संग्रहीत करना

  5. MySQL:डेटा बदले बिना अद्यतन, संभव है?