2012-06-08 14 views
6

मुझे बाईं ओर शामिल होने में थोड़ी सी समस्या है जहां मैं डिज़ाइन की एक सूची चाहता हूं और प्रत्येक डिज़ाइन पर मैं प्रदर्शित करना चाहता हूं कि प्रत्येक डिज़ाइन में कितनी टिप्पणियां हैं।बाएं जॉइन में और जहां

मैं एक वाम उपयोग कर रहा हूँ

SELECT ds.*, count(com.comment) AS countcom FROM tdic_designs ds 
LEFT JOIN tdic_comments com ON (com.design_id = ds.id) 
WHERE ds.approved = 1 AND ds.hidden = 0 AND com.approved = 1 
GROUP BY ds.id 
ORDER BY ds.date_added ASC 

शामिल हों लेकिन उस के रूप में यह केवल एक ही डिजाइन जो 1 टिप्पणी प्रदर्शित करता है काम नहीं करता है, लेकिन मैं मेज, जहां दूसरे डिजाइन नहीं है में दो डिजाइन एक टिप्पणी है

अगर मैं

SELECT ds.*, count(com.comment) AS countcom FROM tdic_designs ds 
LEFT JOIN tdic_comments com ON (com.design_id = ds.id) 
GROUP BY ds.id, com.approved, ds.approved 
ORDER BY ds.date_added ASC 

को एसक्यूएल बदल कहां खंड को हटा रहा है यही कारण है कि। लेकिन यह बुरा है क्योंकि यह उन दोनों डिज़ाइनों और टिप्पणियों का चयन करेगा जिन्हें अनुमोदित नहीं किया गया है।

मुझे क्या याद आती है/गलत करता है?

+0

'MySQL', मुझे लगता है में बाहरी मेज पर फिल्टर कदम होगा? – Quassnoi

उत्तर

8

ले जाएँ ON खंड के लिए टिप्पणियों पर सभी फिल्टर:

SELECT ds.*, COUNT(com.design_id) AS countcom 
FROM tdic_designs ds 
LEFT JOIN 
     tdic_comments com 
ON  com.design_id = ds.id 
     AND com.approved = 1 
WHERE ds.approved = 1 
     AND ds.hidden = 0 
GROUP BY 
     ds.id 
ORDER BY 
     ds.date_added ASC 
+0

एक इलाज की तरह काम करता है! आपका बहुत बहुत धन्यवाद! –

3

आप WHERE खंड का उपयोग करते हैं, उन प्रतिबंधों पंक्तियों left join द्वारा प्रदान की जाती हैं करने के लिए लागू करने के लिए कर रहे हैं। इसलिए, अगर वे प्रतिबंधों से सहमत नहीं हैं तो कुछ पंक्तियां हटा दी जाती हैं।

आपको क्या करना है, ON खंड में उन प्रतिबंधों को रखा गया है और इसे काम करना चाहिए ताकि यह काम न करे, यह पंक्ति को हटाने के बजाय NULL दिखाता है।

कुछ इस तरह:

SELECT ds.id, count(com.comment) AS countcom 
FROM tdic_designs ds 
LEFT JOIN tdic_comments com ON (com.design_id = ds.id) AND ds.approved = 1 AND ds.hidden = 0 AND com.approved = 1 
GROUP BY ds.id 
ORDER BY ds.date_added ASC 

एक अन्य समस्या SELECT में ds.* उपयोग कर रहा है जब आप केवल group BY पर ds.id है।

+0

इस के लिए धन्यवाद :) –

+0

@MortenHagh कोई समस्या नहीं है, अगर यह काम करता है, तो जवाब स्वीकार करना न भूलें :) –

0

समस्या यह है कि जब आप WHERE क्लॉज में com.approved = 1 शामिल करते हैं, तो यह com.approved है - जिसका अर्थ है कि सभी पंक्तियां जहां बाहरी तालिका में कोई मिलान नहीं मिला था।

दूसरों द्वारा सुझाए गए अनुसार, आप ON खंड पर उस स्थिति को स्थानांतरित करके इसे ठीक कर सकते हैं, लेकिन मुझे वास्तव में यह पसंद नहीं है क्योंकि यह एक शर्त स्थिति नहीं है।

मैं एक इनलाइन दृश्य

SELECT ds.*, count(com.comment) AS countcom FROM tdic_designs ds 
LEFT JOIN (SELECT * FROM tdic_comments com WHERE com.approved = 1) com 
ON (com.design_id = ds.id) 
WHERE ds.approved = 1 AND ds.hidden = 0 
GROUP BY ds.id 
ORDER BY ds.date_added ASC 
+0

यह 'MySQL' पर प्रदर्शन को गंभीर रूप से नुकसान पहुंचाएगा। – Quassnoi

+0

@ डेवकोस्टा बहुत खराब समाधान .. –

+0

@ aF.why? यदि आप Quassnoi द्वारा बताए गए एक ही कारण के लिए मतलब है, तो आप सही हो सकते हैं, लेकिन सवाल MySQL निर्दिष्ट नहीं किया था। ओरेकल में, मैं इसके साथ किसी भी प्रदर्शन मुद्दे की उम्मीद नहीं करता। –

संबंधित मुद्दे