MySQL

2011-09-21 8 views
16

का उपयोग कर विभिन्न क्षेत्रों पर एकाधिक group_concat मैं इस तरह एक प्रश्न है:MySQL

SELECT product.id, 
     GROUP_CONCAT(image.id) AS images_id, 
     GROUP_CONCAT(image.title) AS images_title, 
     GROUP_CONCAT(facet.id) AS facets_id 
... 
GROUP BY product.id 

और क्वेरी से काम करता है, लेकिन उम्मीद नहीं के रूप में, अगर मैं 5 पहलुओं और 1 छवि के साथ एक उत्पाद है (एक छवि लगता है क्योंकि आईडी = 7 के साथ), तो मुझे "images_id" में कुछ मिलता है:
"7,7,7,7,7"
यदि मेरे पास 2 छवियां (7 और 3) हैं तो मुझे कुछ मिलता है:
"7,7,7,7,7,3,3,3,3,3"
और पहलुओं में मैं की तरह कुछ मिलता है:
"8,7,6,5,4,8,7,6,5,4"

मुझे लगता है कि MySQL के विभिन्न के मिलन के कुछ प्रकार कर रही है क्वेरी द्वारा लौटाई गई पंक्तियां, और उसके बाद सबकुछ जोड़ना।

मेरे अपेक्षित परिणाम (पिछले उदाहरण के लिए) है:

images_id "7.3"
facets_id = "8,7,6,5,4"

मुझे लगता है कि प्राप्त कर सकते हैं = GROUP_CONCAT में DISTINCT का उपयोग करके, लेकिन फिर मुझे एक और समस्या है: यदि मेरे पास एक ही शीर्षक के साथ दो छवियां हैं, तो उनमें से एक ओमेटेड है, और फिर मुझे कुछ मिलता है:
images_id = "7,3,5"
images_title = "Title7and3, Title5"

तो मुझे images_id और images_title के बीच संबंध याद आती है।

क्या किसी को पता है कि यह क्वेरी MySQL में बनाना संभव है?

शायद मैं बिना किसी वास्तविक लाभ के सबकुछ जटिल कर रहा हूं। मैं केवल एक क्वेरी निष्पादित करने की कोशिश कर रहा हूं क्योंकि प्रदर्शन, लेकिन अब मुझे यकीन नहीं है कि यह दो प्रश्नों को निष्पादित करने के लिए तेज़ है (उदाहरण के लिए छवियों के लिए पहलुओं का चयन करने के लिए एक और दूसरा)।

कृपया बताएं कि आपको क्या लगता है और क्यों इसके लिए सबसे अच्छा समाधान है।

धन्यवाद!

उत्तर

8

आप प्रत्येक समूह के लिए अलग से प्राप्त करने के लिए की आवश्यकता होगी:, इस मुद्दे गति है

SELECT 
    p.id, 
    images_id, 
    images_title, 
    facets_id, 
    ... 
FROM PRODUCT p 
JOIN (SELECT product.id, GROUP_CONCAT(image.id) AS images_id 
     FROM PRODUCT GROUP BY product.id) a on a.id = p.id 
JOIN (SELECT product.id, GROUP_CONCAT(image.title) AS images_title 
     FROM PRODUCT GROUP BY product.id) b on b.id = p.id 
JOIN (SELECT product.id, GROUP_CONCAT(facet.id) AS facets_id 
     FROM PRODUCT GROUP BY product.id) b on c.id = p.id 
... 
+0

मैं आपकी क्वेरी बहुत अच्छी तरह से समझ में नहीं आता है, लेकिन यह बहुत जटिल लग रहा है, मेरा मतलब है, हम एक subselect एक समूह के साथ द्वारा हर concat के लिए की जरूरत है? ऐसा लगता है कि कुछ धीमा है, तेज 2 प्रश्न नहीं है? – Enrique

+2

@ एन्रिक, यह गति के बारे में नहीं है, यह शुद्धता के बारे में है। अगर मेरे कोड को वास्तव में काम करने की आवश्यकता नहीं है तो मैं तुरंत सबकुछ कर सकता हूं। – Johan

+0

@Enrique, आप एक उप चयन हर समूह concat के लिए, केवल उन तालिकाओं जहां p.id के खिलाफ मैच से अधिक 1 पंक्ति रिटर्न p.id. प्रति के लिए की जरूरत नहीं है – Johan

1

तो यह एक बहुत बस को तेजी से सभी डेटा आप अलग-अलग पंक्तियों के रूप में की जरूरत है का चयन हो सकता है, और समूहीकरण आवेदन में, अर्थात्:

SELECT product.id, image.id, image.title, facet.id 
तो आवेदन में

:

foreach row: 
    push product_id onto list_of_product_ids 
    push image_id onto list_of_image_ids 
etc. 
30

बसजोड़ने।

उदाहरण:
GROUP_CONCAT(DISTINCT image.id) AS images_id

+0

+1, यह भी SQLite3 – user457015

+0

के लिए काम किया है तो मुझे इस पर विस्तार करने की आवश्यकता है लगता है। ' 'DISTINCT' => group_concat (अलग image.id) के रूप में images_id' SQL सिंटैक्स होने के लिए प्रकट नहीं होता है, और MySQL 5.1 में सिंटेक्स त्रुटि फेंकता है। प्रश्नकर्ता ने किसी प्रोग्रामिंग भाषा का उल्लेख नहीं किया है, इसलिए यदि यह उत्तर SQL नहीं है तो इसे परिवर्तित या समझा जाना आवश्यक है। – Animism

+0

अतिरिक्त पंक्तियों के बिना एकाधिक 'GROUP_CONCAT'। +1 –

4

तुम बस DISTINCT कीवर्ड जोड़ सकते हैं, तो आप अपनी इच्छा परिणाम प्राप्त करेंगे।

SELECT tb_mod.*, tb_van.*, 
GROUP_CONCAT(DISTINCT tb_voil.vt_id) AS voil, 
GROUP_CONCAT(DISTINCT tb_other.oa_id) AS other, 
GROUP_CONCAT(DISTINCT tb_ref.rp_id) AS referral 
FROM cp_modules_record_tbl tb_mod 
LEFT JOIN cp_vane_police_tbl tb_van ON tb_van.mr_id= tb_mod.id 
LEFT JOIN cp_mod_voilt_tbl tb_voil ON tb_voil.mr_id= tb_mod.id 
LEFT JOIN cp_mod_otheraction_tbl tb_other ON tb_other.mr_id= tb_mod.id 
LEFT JOIN cp_mod_referral_tbl tb_ref ON tb_ref.mr_id= tb_mod.id 
WHERE tb_mod.mod_type = 2 GROUP BY tb_mod.id 

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