2012-07-14 22 views
7

मैं PHP-Bouncer नामक ओपन सोर्स प्रोजेक्ट पर काम कर रहा हूं, और मुझे इसके लिए लिख रहे एक MySQL क्वेरी के साथ समस्याएं हैं। असल में हमारे पास तीन टेबल हैं: बाउंसररोल, पेजइनोल, और बाउंसरपेज ओवरराइड। बाउंसररोल में पहुंच स्तर होते हैं, और अन्य दो टेबल विदेशी कुंजी के माध्यम से बाउंसररोल से लिंक करते हैं और अतिरिक्त डेटा की कई प्रविष्टियां प्रदान करते हैं। मैं निम्न क्वेरी लिखा है भूमिका डेटा मैं एक बार में सभी की जरूरत के सभी खींचने के लिए प्रयास करने के लिए:MySQL Group_Concat दोहराने वाले मान

select BouncerRoles.RoleID, BouncerRoles.RoleName, 
GROUP_CONCAT(PageInRole.PageName separator '|') as ProvidedPages, 
GROUP_CONCAT(CONCAT(BouncerPageOverrides.OverriddenPage,'&',BouncerPageOverrides.OverridingPage) separator '|') as OverriddenPages 
from BouncerRoles join PageInRole on BouncerRoles.RoleID = PageInRole.RoleID 
join BouncerPageOverrides on BouncerRoles.RoleID = BouncerPageOverrides.RoleID 
group by BouncerRoles.RoleID; 

इस क्वेरी का लक्ष्य भूमिका-आईडी, RoleName, बशर्ते पृष्ठों की एक पाइप सीमांकित सूची, प्रदान करना है और एक पाइप ओवरराइड की सीमित सूची (overriddenpage & overridingpage के रूप में)।

RoleID,RoleName,ProvidedPages,OverriddenPages 
2,Exchange,exchange-how.php|exchange-support.php|exchange.php|premium-promo.php|exchange-resorts.php|premiumplus-promo.php|exchange-deposit.php|exchange-requestdestination.php,whyexchange.php&exhange.php|whyexchange.php&exhange.php|whyexchange.php&exhange.php|whyexchange.php&exhange.php|whyexchange.php&exhange.php|whyexchange.php&exhange.php|whyexchange.php&exhange.php|whyexchange.php&exhange.php 
3,Premium,premiumplus-promo.php|premium-cruises.php|premium-resorts.php|premium-condohome.php|premium-hotelaircar.php|premium.php|premium-restaurants.php|premium-overview.php,premium-promo.php&premium.php|premium-promo.php&premium.php|premium-promo.php&premium.php|premium-promo.php&premium.php|premium-promo.php&premium.php|premium-promo.php&premium.php|premium-promo.php&premium.php|premium-promo.php&premium.php 
4,"Premium Plus",premiumplus-exclusiveescapes.php|premiumplus.php|premiumplus-overview.php|premiumplus-concierge.php|premiumplus-airportlounge.php,premiumplus-promo.php&premiumplus.php|premiumplus-promo.php&premiumplus.php|premiumplus-promo.php&premiumplus.php|premiumplus-promo.php&premiumplus.php|premiumplus-promo.php&premiumplus.php 

वहाँ कुछ मैं इस पैदा करने के लिए अपनी क्वेरी में गलत किया है है: सब कुछ क्वेरी के अंतिम स्तंभ, जो प्रविष्टियों यह इस (सीएसवी प्रारूप में उत्पादन) की तरह अधिक से अधिक पाता दोहराता को छोड़कर काम करता है?

+1

मन है कि 'GROUP_CONCAT' आप एक बड़े परिणाम है, तो पिछवाड़े में एक दर्द हो सकता है -> यह केवल एक सीमित आकार परिणाम (मैं 1024 बाइट लगता है, लेकिन यकीन नहीं है), इसलिए यदि आपके resultset वापस आ जाएगी बड़ा होगा यह कट ऑफ हो जाएगा। – Nanne

+3

क्या आप अपने 'GROUP_CONCAT' के अंदर' DISTINCT' खो रहे हैं? ऐसा लगता है कि आपकी भागीदारी कई पंक्तियों को वापस कर रही है। –

+1

@nanne: वह सीमा (1024) एक सेटिंग पर निर्भर करती है। इसे बढ़ाया जा सकता है। –

उत्तर

21

आप शायद दो टेबल के साथ एक टेबल में शामिल हो रहे हैं। रिश्ते, डुप्लिकेट परिणाम उत्पन्न करते हैं।

  • उपयोग या तो GROUP_CONCAT(DISTINCT ...) या

  • दो उपयोग सबक्वेरी: हर एक 2 टेबल में से प्रत्येक पर से समूह के साथ प्रयोग के GROUP_CONCAT() में। फिर दो subqueries और मुख्य तालिका में शामिल हों।

+0

दूसरे समूह_कोनकैट में विशिष्ट जोड़ना चाल ... धन्यवाद! –

+0

क्या कोई अन्य विकल्प नहीं है? एक बड़े डेटासेट के साथ (मेरे मामले में) सबक्वायरीज़ बहुत धीमी हैं, फिर भी मैं अलग-अलग उपयोग नहीं कर सकता क्योंकि मुझे यह मानने के लिए भी आवश्यक प्रत्येक मूल्य की आवश्यकता है .. –

+0

@ थॉमसक्लोस आप तब एक प्रश्न पोस्ट कर सकते हैं। वास्तविक क्वेरी, टेबल की परिभाषाएं (इंडेक्स सहित) और निष्पादन योजना शामिल करना न भूलें। आप [http://dba.stackexchange.com/] पर भी प्रश्न पोस्ट कर सकते हैं (http://dba.stackexchange.com/) जहां यह बेहतर हो सकता है tention। –

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