2011-08-31 15 views
5

मैं काफी बड़ा SQL कर रहा हूं इसलिए मैं क्षमा चाहता हूं कि मेरी टेबल का एक बड़ा उदाहरण प्रदान न करें।MySQL IF में GROUP_CONCAT

SELECT 
customer_id, 
agreement_id, 
if('network' IN (GROUP_CONCAT(DISTINCT services.service_code 
           SEPARATOR ',') ), 
        'Yes','No') as networkservice 
FROM customers 
INNER JOIN agreement USING(customer_id) 
INNER JOIN services USING(agreement_id) 
GROUP BY customer_id 

एक ग्राहक के पास एक समझौता हो सकता है और एक समझौते में बहुत सारी सेवाएं हो सकती हैं। मैं यह पता लगाने की कोशिश कर रहा हूं कि 'नेटवर्क' उस समझौते में से एक है।

चूंकि GROUP_CONCAT एक अल्पविराम से अलग सूची लौटाता है, यह मेरे मामले के लिए बिल्कुल सही लगता है। लेकिन मैं इसे काम करने के लिए नहीं मिल सकता और मैं विचारों से बाहर चला रहा हूँ।

केवल एक ही सेवा नहीं है और कहा कि सेवा 'नेटवर्क' यह हाँ देता है, लेकिन अगर वहाँ एक से अधिक यह सं

अगर मैं का उपयोग करें (INT) service_id बजाय इसे, कोई फर्क नहीं पड़ता जब तक INT रिटर्न है मैं सूची में सबसे पहले खोज रहा हूँ। लेकिन केवल INT के लिए thats, अगर 'नेटवर्क' सूची में पहले है यह सं रिटर्न

मैं कोशिश की है:

if('network' IN (CAST(GROUP_CONCAT(DISTINCT services.service_code 
             SEPARATOR ' ') AS CHAR) ), 
        'Yes','No') 

और

if('network' IN (concat('\'', 
        GROUP_CONCAT(DISTINCT services.service_code 
           SEPARATOR '\', \''), 
        '\'')), 'Yes','No') 

मैं और अधिक उदाहरण प्रदान कर सकते हैं अगर मेरी व्याख्या ध्वनि उलझन में है।

धन्यवाद।

उत्तर

5

मैं एक बड़ा प्रशंसक group_concat की हूँ, लेकिन आप इस मामले

sum(if(services.service_code='network', 1, 0)) as networkservice 
+0

धन्यवाद, एसयूएम का उपयोग करने के बारे में कभी सोचा नहीं। मैंने इसे 'आईएफ (sum (if.s service_cervice_code =' network ', 1, 0))> 0,' हां ',' नहीं) नेटवर्क सेवा के रूप में इस्तेमाल किया और यह बहुत अच्छा काम करता है। – Cleric

1

GROUP_CONCAT इस तरह काम नहीं करता है, group_concat के बाद क्वेरी इस तरह दिखता है:

GROUP_CONCAT('1,2,3,4') 

और इस काम करने के लिए, यह इस तरह देखने के लिए होगा: इसके बजाय

GROUP_CONCAT('1', '2', '3', '4') 

, group_concat ommitting कोशिश: (ध्यान दें गैर उद्धृत network)

if(network IN (DISTINCT services.service_code)), 'Yes','No') 

इस, काम नहीं करता है एक उप चयन के साथ प्रयास करें:

if(network IN (SELECT service_code FROM services WHERE ...) 

हालांकि यह बहुत धीमी हो जाएगा।

+0

'अगर ((group_concat (अलग services.service_code SEPARATOR '\', \ 'में नेटवर्क' ')),' जा ',' Nej ')' एक सूची है कि 'group_concat की तरह लग रहा लौट जाना चाहिए ('1', '2', '3', '4') ', वैसे भी ऐसा लगता है। लेकिन यह काम नहीं करता है। Group_concat को ओमिट करना केवल तभी काम करता है जब 'नेटवर्क' उस पंक्ति पर मौजूद service_code है जो मैं समूहबद्ध करता हूं, और मैं सेवा_code पर ऑर्डर नहीं कर सकता।Unquote नेटवर्क एसक्यूएल तोड़ता है। और मेरे पास SubQuery का उपयोग करने की संभावना नहीं है। आपके प्रतिक्रिया के लिए धन्येवाद। – Cleric

0

नीचे कोड की मदद का उपयोग कर देगा में group_concat की आवश्यकता नहीं है?

IF((GROUP_CONCAT(Direct SEPARATOR ',') REGEXP 'Y'), 'Yes','No') AS Direct 
2

GROUP_CONCAT समारोह एक स्ट्रिंग देता है, ताकि आप FIND_IN_SET उपयोग कर सकते हैं। यह एक दूसरे तर्क के रूप में एक अल्पविराम से अलग स्ट्रिंग लेता है।

IF( FIND_IN_SET ('network', GROUP_CONCAT(DISTINCT services.service_code SEPARATOR ',') ), 'Yes','No') as networkservice 
संबंधित मुद्दे