2009-07-01 20 views
52

अग्रिम धन्यवाद, मुझे बस यह प्रतीत नहीं होता है!एकाधिक पंक्ति पंक्तियों को एक पंक्ति में संयोजित करें MYSQL

मैं दो तालिकाओं

Ordered_Item

ID | Item_Name 
1 | Pizza 
2 | Stromboli

Ordered_Options है

Ordered_Item_ID | Option_Number | Value 
     1    43   Pepperoni 
     1    44   Extra Cheese 
     2    44   Extra Cheese

क्या मैं उत्पादन के लिए देख रहा हूँ एक mysql क्वेरी इस आशय के लिए कुछ है

आउटपुट

ID | Item_Name | Option_1 | Option_2 
1 Pizza  Pepperoni Extra Cheese 
2 Stromboli  NULL  Extra Cheese

मैं सिंटेक्स त्रुटि में कई विकल्प सबसे अंत की कोशिश की है, मैं group_concat की कोशिश की लेकिन नहीं thats वास्तव में मैं क्या देख रहा हूँ है। मेरे पास एक क्रूड उदाहरण है जो मुझे लगता है कि एक शुरुआत हो सकती है। मुझे हर बार एक ही क्रम में रहने के विकल्प की आवश्यकता है। और उस कार्यक्रम में जहां जानकारी एकत्र की जाती है, भरोसेमंद सुनिश्चित करने का कोई तरीका नहीं है कि ऐसा होगा। क्या विकल्प संख्या के अनुसार उन्हें समेकित करना संभव है। इसके अलावा मुझे पता है कि मेरे पास 5 से अधिक विकल्प नहीं होंगे, इसलिए एक स्थिर समाधान

Select Ordered_Items.ID, 
    Ordered_Items.Item_Name, 
FROM Ordered_Items 
    JOIN (SELECT Ordered_Options.Value FROM Ordered_Options Where Option_Number = 43) as Option_1 
     ON Ordered_Options.Ordered_Item_ID = Ordered_Item.ID 
    JOIN (SELECT Ordered_Options.Value FROM Ordered_Options Where Option_Number = 44) as Option_2 
     ON Ordered_Options.Ordered_Item_ID = Ordered_Item.ID; 

धन्यवाद! जो

उत्तर

90

सबसे आसान तरीका है group_concat समूह समारोह यहां का उपयोग करना होगा ..

select 
    ordered_item.id as `Id`, 
    ordered_item.Item_Name as `ItemName`, 
    GROUP_CONCAT(Ordered_Options.Value) as `Options` 
from 
    ordered_item, 
    ordered_options 
where 
    ordered_item.id=ordered_options.ordered_item_id 
group by 
    ordered_item.id 

कौन सा होगा उत्पादन:

Id    ItemName  Options 

1    Pizza   Pepperoni,Extra Cheese 

2    Stromboli  Extra Cheese 

इस तरह आप आप के रूप में कई विकल्प होते हैं अपनी क्वेरी को संशोधित किए बिना चाहते हैं।

आह, अगर आप अपने परिणाम देख काटी हो रही है, तो आप group_concat के आकार की सीमा इस तरह बढ़ा सकते हैं:

SET SESSION group_concat_max_len = 8192; 
+3

उन्होंने कहा, "मैंने group_concat की कोशिश की है, लेकिन वास्तव में यह नहीं है कि मैं क्या देख रहा हूं।" –

+0

हैलो, त्वरित प्रतिक्रिया के लिए धन्यवाद लेकिन मुझे डर है कि मैंने जानकारी का एक महत्वपूर्ण हिस्सा शामिल नहीं किया है। मुझे हर बार एक ही क्रम में रहने के विकल्प की आवश्यकता है। और उस कार्यक्रम में जहां जानकारी एकत्र की जाती है, भरोसेमंद सुनिश्चित करने का कोई तरीका नहीं है कि ऐसा होगा। क्या विकल्प संख्या के अनुसार उन्हें समेकित करना संभव है। इसके अलावा मुझे पता है कि मेरे पास कभी भी 5 विकल्प नहीं होंगे, इसलिए एक स्थिर समाधान काम करेगा। –

+4

समूह के भीतर वस्तुओं को ऑर्डर करने के लिए, आप इसे उदाहरण के लिए कर सकते हैं: GROUP_CONCAT (Ordered_Options. Ordered_Options.value द्वारा वैल्यू ऑर्डर), –

1

क्या आप चाहते हैं एक धुरी कहा जाता है, और इसे सीधे MySQL में समर्थित नहीं है, इस जाँच विकल्प आप मिल गया है के लिए बाहर का जवाब:

How to pivot a MySQL entity-attribute-value schema

8

मैं सहायता की सराहना करते हैं, मैं अगर किसी को प्रभावशीलता मैं इसे सराहना करते हैं पर कोई टिप्पणी करेंगे मैं एक समाधान पाया है लगता है। अनिवार्य रूप से मैंने क्या किया है।मुझे पता है यह इसके कार्यान्वयन में कुछ हद तक स्थिर है, लेकिन मुझे लगता है मैं यह करने के लिए (गलत वाक्यविन्यास माफ)

SELECT 
    ordered_item.id as `Id`, 
    ordered_item.Item_Name as `ItemName`, 
    Options1.Value 
    Options2.Value 
FROM ORDERED_ITEMS 
LEFT JOIN (Ordered_Options as Options1) 
    ON (Options1.Ordered_Item.ID = Ordered_Options.Ordered_Item_ID 
     AND Options1.Option_Number = 43) 
LEFT JOIN (Ordered_Options as Options2) 
    ON (Options2.Ordered_Item.ID = Ordered_Options.Ordered_Item_ID 
     AND Options2.Option_Number = 44); 
+4

यह बनाए रखना मुश्किल होगा। जल्द या बाद में आपका ग्राहक तीसरा या 4 वां विकल्प प्राप्त करना चाहता है, और तब तक आपको सबकुछ फिर से लिखना होगा। –

+0

एक और उत्तर जोड़ा गया जो आपके द्वारा पोस्ट की गई क्वेरी के समान परिणाम देता है, लेकिन यह थोड़ा अधिक लचीला है। आपके पास अभी भी विकल्पों की असीमित संख्या हो सकती है, जबकि आपके परिणाम में पिज्जा विकल्पों के लिए अभी भी कई कॉलम प्राप्त हो रहे हैं। –

1

तुम सच में अपने परिणाम में एकाधिक स्तंभों की जरूरत है की जरूरत है क्या करता है, और विकल्प की राशि सीमित है, आप कर सकते हैं यहां तक ​​कि इस कार्य करें:

select 
    ordered_item.id as `Id`, 
    ordered_item.Item_Name as `ItemName`, 
    if(ordered_options.id=1,Ordered_Options.Value,null) as `Option1`, 
    if(ordered_options.id=2,Ordered_Options.Value,null) as `Option2`, 
    if(ordered_options.id=43,Ordered_Options.Value,null) as `Option43`, 
    if(ordered_options.id=44,Ordered_Options.Value,null) as `Option44`, 
    GROUP_CONCAT(if(ordered_options.id not in (1,2,43,44),Ordered_Options.Value,null) as `OtherOptions` 
from 
    ordered_item, 
    ordered_options 
where 
    ordered_item.id=ordered_options.ordered_item_id 
group by 
    ordered_item.id 
1

आप जानते हैं कि आप तो मैं (आदेश के अनुसार 4 विकल्पों में से अधिकतम के लिए उदाहरण) इस कोशिश करेगा अधिकतम विकल्पों में से एक सीमित संख्या के लिए जा रहे हैं:

Select OI.ID, OI.Item_Name, OO1.Value, OO2.Value, OO3.Value, OO4.Value 

FROM Ordered_Items OI 
    LEFT JOIN Ordered_Options OO1 ON OO1.Ordered_Item_ID = OI.ID 
    LEFT JOIN Ordered_Options OO2 ON OO2.Ordered_Item_ID = OI.ID AND OO2.ID != OO1.ID 
    LEFT JOIN Ordered_Options OO3 ON OO3.Ordered_Item_ID = OI.ID AND OO3.ID != OO1.ID AND OO3.ID != OO2.ID 
    LEFT JOIN Ordered_Options OO4 ON OO4.Ordered_Item_ID = OI.ID AND OO4.ID != OO1.ID AND OO4.ID != OO2.ID AND OO4.ID != OO3.ID 

GROUP BY OI.ID, OI.Item_Name

जी शर्त से रप उन सभी डुप्लिकेट से छुटकारा पाता है जिन्हें आप अन्यथा प्राप्त करेंगे। मैंने बस उस साइट पर कुछ ऐसा ही लागू किया है जिस पर मैं काम कर रहा हूं, जहां मुझे पता था कि मेरे पास हमेशा मेरे बच्चे की मेज में 1 या 2 मिलान होता है, और मैं यह सुनिश्चित करना चाहता था कि मेरे पास प्रत्येक मूल वस्तु के लिए केवल 1 पंक्ति थी।

0

यहां इस प्रकार की आवश्यकता के लिए आप अपनी क्वेरी कैसे बनाएंगे।

select ID,Item_Name,max(Flavor) as Flavor,max(Extra_Cheese) as Extra_Cheese 
    from (select i.*, 
        case when o.Option_Number=43 then o.value else null end as Flavor, 
        case when o.Option_Number=44 then o.value else null end as Extra_Cheese 
       from Ordered_Item i,Ordered_Options o) a 
    group by ID,Item_Name; 

आप मूल रूप से प्रत्येक स्तंभ "मामला है जब" का उपयोग "मामले बाहर"। फिर प्रत्येक इच्छित आइटम के लिए "समूह द्वारा" का उपयोग करके उन स्तंभों में से प्रत्येक के लिए "अधिकतम()" चुनें।

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