2011-03-08 17 views
5

मैं निम्न क्वेरी के साथ एक समस्या हो रहा है (यदि यह एक नकली सवाल तो है मैं बहुत माफी चाहता हूँ, लेकिन मैं अभी तक कि मेरी मदद कर सकते कुछ भी नहीं कर पा रहे):mysql group_concat जहां

SELECT d.*, GROUP_CONCAT(g.name ORDER BY g.name SEPARATOR ", ") AS members 
FROM table_d AS d LEFT OUTER JOIN table_g AS g ON (d.eventid = g.id) 
WHERE members LIKE '%p%'; 

MySQL स्पष्ट रूप से WHERE खंड में GROUP_CONCAT कॉलम की तुलना को संभाल नहीं सकता है। तो मेरा प्रश्न बहुत आसान है। क्या इसके लिए कोई कामकाज है, उप-क्वेरी या कुछ समान उपयोग करने की तरह? मुझे वास्तव में कोड के इस टुकड़े को काम करने की ज़रूरत है और वास्तव में क्वेरी में इसे संभालने के अलावा अन्य उपयोग करने का कोई विकल्प नहीं है।

संपादित करें 1:

मैं वास्तविक कोड नहीं दिखाया जाएगा के रूप में इस गोपनीय हो सकता है, मैं अपने साथियों के साथ जांच करने के लिए होगा। वैसे भी, मैंने यह कोड आपको इस तरह लिखा है कि कथन कैसा दिखता है, हालांकि मैं आपके साथ सहमत हूं कि यह बहुत समझ में नहीं आता है। मैं एक मिनट में नीचे दिए गए उत्तरों की जांच करने जा रहा हूं, फिर मैं आपके पास वापस आऊंगा। पहले से ही सभी मदद के लिए thnx!

संपादित करें 2:

HAVING का उपयोग कर की कोशिश की, लेकिन यह है कि केवल काम करता है जब मैं GROUP BY का उपयोग नहीं कर रहा हूँ। जब मैं इसे आज़माता हूं, तो यह मुझे एक वाक्यविन्यास त्रुटि देता है, लेकिन जब मैं GROUP BY हटाता हूं तो क्वेरी पूरी तरह से काम करती है। बात यह है कि, मुझे GROUP BY की आवश्यकता है अन्यथा क्वेरी मेरे लिए व्यर्थ होगी।

संपादित करें 3:

ठीक है, तो मैं एक बेवकूफ गलती की है और GROUP BY, जो स्पष्ट रूप से काम नहीं करता है से पहले HAVING डाल दिया। सभी मदद के लिए धन्यवाद, यह अब काम करता है!

+0

क्या ' '% पीटर%'' तरह g.name साथ गलत क्या है? – ajreal

उत्तर

12

के बजाय HAVING का उपयोग करें।

... HAVING members LIKE '%peter%' 

WHERE फिल्टर से पहले GROUP_CONCAT मूल्यांकन किया जाता है लागू होता है; HAVING इसे बाद में लागू करता है।

संपादित करें: मुझे आपकी क्वेरी थोड़ा उलझन में मिलती है। ऐसा लगता है कि यह एक ही स्ट्रिंग में आपके सभी नामों के साथ केवल एक पंक्ति प्राप्त करने जा रहा है - जब तक कि आपके डेटाबेस में पीटर नामक कोई भी नहीं है, तो यह मामला कुछ भी वापस नहीं करेगा।

शायद HAVING वास्तव में आप यहाँ क्या जरूरत नहीं है ...

+0

उत्कृष्ट उत्तर! – BigFatBaby

+1

@dnagirl: group_concat में पहले से ही एक उपनाम है ... यह 'सदस्य' है इसलिए @awm पूरी तरह से सही था। – BigFatBaby

+0

आप निश्चित रूप से ** ** एक खंड में एक उपनाम का उपयोग कर सकते हैं। कोशिश करो! – awm

2

बजाय

SELECT ... 
... 
WHERE g.name = 'peter' 

की कोशिश करो। चूंकि आप बस एक साधारण नाम लुकअप कर रहे हैं, इसलिए व्युत्पन्न फ़ील्ड को खोजने की कोई आवश्यकता नहीं है - बस अंतर्निहित मूल फ़ील्ड पर मिलान करें।

0

GROUP_CONCAT एक समग्र कार्य है। आपको GROUP BY something होना है। तुम सिर्फ सभी पंक्तियां है उन में %peter% कोशिश चाहते हैं

SELECT d.*, g.name 
FROM table_d AS d 
    LEFT OUTER JOIN table_g AS g 
    ON (d.eventid = g.id) 
WHERE g.name LIKE '%peter%'; 
+0

के बाद 'हैविंग' नहीं रखा जो पूरी तरह से सही नहीं है। हां - 'GROUP_CONCAT' एक समेकित कार्य है, लेकिन नहीं - आपको कुछ 'ग्रुप बाय' करने की आवश्यकता नहीं है। MySQL बस एक ही समूह में सेट किए गए सभी परिणामों को समूहित करता है यदि कोई समूह 'ग्रुप बाय' कथन नहीं दिया गया था, जो यहां वांछित प्रभाव हो सकता है। – BigFatBaby

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