2008-08-06 20 views
20

मैं बाहर कोशिश कर रहा हूँ निम्न क्वेरी:मैं MySQL में पूरे परिणाम सेट को कैसे जोड़ूं?

SELECT A,B,C FROM table WHERE field LIKE 'query%' 
UNION 
SELECT A,B,C FROM table WHERE field LIKE '%query' 
UNION 
SELECT A,B,C FROM table WHERE field LIKE '%query%' 
GROUP BY B ORDER BY B ASC LIMIT 5 

तीन प्रश्नों को एक साथ अटक है यही कारण है, kindasorta। हालांकि, परिणाम सेट जो वापस आता है क्वेरी # 3 (अवांछित) से परिणामों से पहले प्रश्न # 3 से परिणाम दर्शाता है।

क्या इन्हें प्राथमिकता देने का कोई तरीका है ताकि परिणाम क्वेरी # 1 के लिए आते हैं, फिर सभी क्वेरी # 2 के लिए सभी प्रश्न # 3 के लिए आते हैं? मैं अभी तक PHP में ऐसा नहीं करना चाहता हूं (उदाहरण के लिए नियंत्रण नहीं करना चाहिए जो पहले प्रश्न में दिखाया गया है कि दूसरे में और आगे नहीं दिखाना चाहिए)।

उत्तर

16

हो सकता है कि आप एक चौथे स्तंभ सहित की कोशिश करनी चाहिए, और:

3

आप इसे एक subselect के रूप में, कुछ की तरह

select * from (
    SELECT A,B,C FROM table WHERE field LIKE 'query%' 
    UNION 
    SELECT A,B,C FROM table WHERE field LIKE '%query' 
    UNION 
    SELECT A,B,C FROM table WHERE field LIKE '%query%' 
) ORDER BY B ASC LIMIT 5 
0

कर सकते हैं अगर वहाँ एक तरह से है कि समझ में आता है उन्हें ऑर्डर करने के लिए आप चाहें, तो एक साथ संघ परिणाम नहीं है नहीं है - सिर्फ 3 अलग recordsets वापसी , और उनके डेटा स्तर के अनुसार उनके साथ सौदा। तालिका यह से आया बताते हुए

SELECT A,B,C,1 as [order] FROM table WHERE field LIKE 'query%' 
UNION 
SELECT A,B,C,2 as [order] FROM table WHERE field LIKE '%query' 
UNION 
SELECT A,B,C,3 as [order] FROM table WHERE field LIKE '%query%' 
GROUP BY B ORDER BY [order] ASC, B ASC LIMIT 5 
6

हार्ड-कोडेड मान समग्र resultset सॉर्ट करने के लिए उपयोग करते हैं, तो जैसे के साथ एक अतिरिक्त स्तंभ जोड़ें तो आदेश और इसके द्वारा समूह:

SELECT A,B,C, "query 1" as origin FROM table WHERE field LIKE 'query%' 
UNION 
SELECT A,B,C, "query 2" as origin FROM table WHERE field LIKE '%query' 
UNION 
SELECT A,B,C, "query 3" as origin FROM table WHERE field LIKE '%query%' 
GROUP BY origin, B ORDER BY origin, B ASC LIMIT 5 
0

मैं अंत में (सभी सुझावों को देखकर) इस समाधान के लिए आया था, मैं क्या जरूरत है और समय के बीच एक समझौता करने के अपने एक सा।

SELECT * FROM 
    (SELECT A, B, C, "1" FROM table WHERE B LIKE 'query%' LIMIT 3 
    UNION 
    SELECT A, B, C, "2" FROM table WHERE B LIKE '%query%' LIMIT 5) 
AS RS 
GROUP BY B 
ORDER BY 1 DESC 

यह चौथे "कॉलम" से कुल 5 परिणाम प्रदान करता है और मुझे जो चाहिए वह देता है; एक प्राकृतिक परिणाम सेट (यह AJAX पर आ रहा है), और एक वाइल्डकार्ड परिणाम सही बाद में सेट किया गया है।

:)

/mp

1

से ( चयन ए, बी, सी, 1 का चयन विशिष्ट एक, ख, ग के रूप में ओ मेज से कहां क्षेत्र की तरह 'क्वेरी%' यूनिअन का चयन करें , बी, सी, के रूप में 2 ओ मेज से कहां क्षेत्र की तरह '% क्वेरी' यूनिअन चयन ए, बी, सी, 3 के रूप में ओ मेज से कहां क्षेत्र की तरह '% क्वेरी%' ) आदेश द्वारा ओ एएससी सीमा 5

ऐसा करने का मेरा तरीका होगा। मैं नहीं जानता कि कैसे तराजू।

मैं

GROUP BY B ORDER BY B ASC LIMIT 5 

समझ में नहीं आता यह संघ में पिछले चयन करने के लिए केवल लागू होता हो?

क्या mysql वास्तव में आपको कॉलम द्वारा समूहबद्ध करने की अनुमति देता है और फिर भी अन्य कॉलम पर समेकित नहीं करता है?

संपादित करें: aaahh। मैं देखता हूं कि MySQL वास्तव में करता है। यह DISTINCT (बी) या कुछ का एक विशेष संस्करण है। मैं उस क्षेत्र में एक विशेषज्ञ बनने की कोशिश नहीं करना चाहता :) :)

0

यूनियन के दो भिन्नताएं हैं।

'UNION' and 'UNION ALL' 

ज्यादातर मामलों क्या तुम सच में कहना चाहता हूँ में सेट जो निष्पादन समय के संदर्भ में काफी बचत का एक सा हो सकता है के बीच यह डुप्लिकेट उन्मूलन नहीं करता है सभी के रूप में संघ है (सोचो SELECT DISTINCT)।

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

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