2011-12-16 2 views
9

का उपयोग करके फ़िल्टरिंग मेरे पास आइटम की एक तालिका है और मेरे पास प्रत्येक आइटम की व्यक्तिगत खरीद वाली एक अलग तालिका है। हर आइटम खरीदा नहीं गया है। मैं खरीद गिनती का चयन कर रहा हूँ और एक बयान निम्न के समान के साथ आइटम की मेज के साथ इसमें शामिल होने:बाएं जॉइन से नल कॉलम पर डिफ़ॉल्ट मान सेट करना और WHERE

SELECT items.name, purchases_count 
FROM `items` 
    LEFT JOIN (SELECT sales.item_name, SUM(unit_sales) AS purchases_count 
     FROM sales GROUP BY item_name) sales ON sales.item_name = items.uid 

इस के समान डेटा में परिणाम:

+------+-----------------+ 
| name | purchases_count | 
|------+-----------------+ 
| Shoe | 12    | 
| Belt | NULL   | 
+------+-----------------+ 

मेरे समस्या पैदा होती है जब मैं फ़िल्टर करना चाहते हैं यह परिणाम purchases_count पर है। अगर मैं WHERE purchases_count < 10 या कुछ ऐसा ही उपयोग करता हूं, तो कोई बिक्री रिकॉर्ड वाले आइटम (यानी NULL मान वाले) को खोज से बाहर रखा गया है।

मैंने COALESCE(purchases_count,0) AS purchases_count का उपयोग करने का प्रयास किया है जो NULL रिकॉर्ड 0 पर सही ढंग से सेट करता है, लेकिन WHERE का उपयोग करते समय वे अभी भी दिखाई नहीं दे रहे हैं। मुझे संदेह है कि COALESCEWHERE के बाद हो रहा है।

मैं WHERE का उपयोग करके इस नंबर पर फ़िल्टर करने में सक्षम होना चाहता हूं और यदि संभव हो तो NULL परिणाम (शून्य के रूप में) शामिल करें। कोई सुझाव?

+0

'छोड़ दिया की alias' में शामिल होने तालिका तालिका नाम के समान है, यह अच्छा अभ्यास है ?? – diEcho

+0

SQL क्वेरी को केवल प्रश्न पर ध्यान केंद्रित करने के लिए सरलीकृत किया गया है, वास्तविक एसक्यूएल इसके लिए अलग है। –

उत्तर

7

एलियंस आमतौर पर WHERE खंड में लागू नहीं होते हैं - COALESCE(purchases_count,0) AS purchases_count_2where purchases_count_2 < 10 के साथ मेरा मतलब यह देखने के लिए प्रयास करें।

where COALESCE(purchases_count,0) < 10 काम करना चाहिए।

+0

खरीद का उपयोग करना_count_2 काम नहीं करेगा, सामान्य खरीददारी पर COALESCE का उपयोग करने के समान ही समस्या है - यह WHERE खंड में मान्यता प्राप्त नहीं है। 'कहां COALESCE (buyases_count, 0) <10' काम करता है, लेकिन मुझे यहां कोलेस को लपेटने की आवश्यकता नहीं है। हालांकि, धन्यवाद, अब के लिए सबसे अच्छा विकल्प हो सकता है। –

+0

यह सुनिश्चित नहीं है कि यह MySQL पर काम करता है लेकिन आप एक सबक्वायरी का उपयोग कर सकते हैं: 'चुनें * से चुनें (चुनें ... coalesce (buyases_count, 0) buyases_count ...) जहां buyases_count <10' – wrschneider

1

कैसे के बारे में:

WHERE (purchases_count < 10) OR (purchases_count IS NULL) 
निश्चित रूप से

, आप अभी भी शून्य मान के साथ छोड़ दिया जाना चाहते हैं, लेकिन आप अभी भी बाद में उपयोग के लिए शून्य में उन nulls चालू करने के लिए COALESCE विकल्प का प्रयास कर सकते हैं।

+0

विचार यह है कि मैं बनना चाहता हूं इन नंबरों पर मनमाने ढंग से फ़िल्टर लागू करने में सक्षम, इसलिए मैं नहीं चाहता कि जब मैं खरीददारी की तलाश कर रहा हूं तो एनयूएलएल वापस लौटाया जा रहा है> उदाहरण के लिए 6, जो इसका उपयोग करने वाला मामला होगा। –

0

COALESCE सही तरीका है, लेकिन जहां, कोशिश आप उपयोग नहीं करना चाहिए: -

HAVING purchases_count<=10 
+0

यह पूरी तरह से गलत है। ग्रुप BY का उपयोग करते समय केवल तभी लागू होता है। – JamieSee

+0

जो ऐसा कहते हैं ????? – ajreal

+1

एसक्यूएल मानक के लिए आवश्यक है कि हैविंग को ग्रुप बाय क्लॉज या समेकित कार्यों में उपयोग किए गए कॉलम में केवल कॉलम का संदर्भ देना चाहिए। हालांकि, MySQL इस व्यवहार के विस्तार का समर्थन करता है, और बाहरी सबक्वायरी में SELECT सूची और कॉलम में कॉलम को संदर्भित करने की अनुमति देता है। – ajreal

0

तो, आप एक जहां खंड इस तरह जोड़ सकते हैं:

WHERE purchases_count < 10 OR purchases_count is NULL 
0

यू इस

कोशिश की है
SELECT items.name, IFNULL(purchases_count,0) 
FROM `items` 
LEFT JOIN (
      SELECT item_name, SUM(unit_sales) AS purchases_count 
      FROM sales GROUP BY item_name 
      ) s ON s.item_name = items.uid 
GROUP BY items.name 
HAVING purchases_count >10 
+0

यह पूरी तरह से गलत है। ग्रुप BY का उपयोग करते समय केवल तभी लागू होता है। – JamieSee

+0

COALESCE वैसे भी कुछ भी नहीं करेगा क्योंकि शुरू करने के लिए सबक्वायरी में शून्य से COALESCE के लिए कोई नल डेटा नहीं है। –

+0

देखें कि 'बाएं शामिल' में 'समूह BY'' – diEcho

2

एक अलग क्वेरी में खरीद की गणना करने के बजाय, बस मुख्य क्वेरी को समूहबद्ध करें। गिनती पर फ़िल्टर करने के लिए, डाल एक having caluse में है कि:

select i.name, coalesce(sum(s.unit_sales), 0) as purchases_count 
from items i 
left join sales s on s.item_name = i.uid 
group by i.name 
having purchases_count < 10 
संबंधित मुद्दे