यहाँ एक तरकीब है:एक 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
खंड। चयन-सूची में सभी भावों का मूल्यांकन किए जाने के बाद ये खंड चलाए जाते हैं।