2011-09-16 19 views
5

मेरे पास एक पंक्ति है जिसमें कई पंक्तियां हैं जिनके पास एक ही डेटा है। मैंने एक अद्वितीय पंक्ति प्राप्त करने के लिए SELECT DISTINCT का उपयोग किया और यह ठीक काम करता है। लेकिन जब मैं ORDER BYSELECT DISTINCT के साथ उपयोग करता हूं तो यह मुझे बिना छेड़छाड़ डेटा देता है।MySQL में डिस्टिंट का चयन कैसे करें?

क्या कोई मुझे बता सकता है कि कितना अलग काम करता है?

यह किस आधार पर पंक्ति का चयन करता है इसके आधार पर?

+0

आप कौन से प्रश्न चलाने की कोशिश कर रहे हैं? – srivani

+0

@srivani: तालिका से अलग आईडी का चयन करें जहां id2 = 12312 आदेश समय के अनुसार आदेश। – insomiac

+0

मुझे पता है कि यह बहुत देर हो चुकी है लेकिन अभी तक कोई स्वीकार्य उत्तर नहीं है, इसलिए मैं जानना चाहता हूं कि ओपी अभी भी किसी ऐसे उत्तर के लिए उत्तर देना चाहता है जो दिए गए उत्तरों में शामिल नहीं है? –

उत्तर

1

जब आप SELECT DISTINCT निर्दिष्ट करते हैं तो यह आपको परिणाम पंक्ति से डुप्लीकेट को समाप्त करने, सभी पंक्तियां देगा। "डुप्लिकेट" से मेरा मतलब पंक्तियां हैं जहां सभी फ़ील्ड समान मान हैं।

id | num 
-------------- 
1 | 1 
2 | 3 
3 | 3 

SELECT DISTINCT * सभी पंक्तियों के ऊपर वापसी होगी, जबकि SELECT DISTINCT num दो पंक्तियों वापसी होगी:

num 
----- 
1 
3 

ध्यान दें कि कौन सी पंक्ति वास्तविक पंक्ति (जैसे: कि क्या उदाहरण के लिए, आप एक तालिका ऐसा दिखता है जैसे है कहना यह पंक्ति 2 या पंक्ति 3 है) यह चयन अप्रासंगिक है, क्योंकि परिणाम अलग-अलग होगा।

अंत में, DISTINCTनहींORDER BY कैसे काम करता है प्रभावित करना चाहिए।

संदर्भ: MySQL SELECT statement

+2

ऐसा लगता है कि यह MYSQL में करता है। इसे पढ़ें: http://dev.mysql.com/doc/refman/5.0/en/distinct-optimization.html – Icarus

+0

यह लगभग एक बग की तरह है :) – Randy

+0

@Icarus यह कौन सा अनुकूलन करता है वह अप्रासंगिक है, जब तक परिणाम सेट जिस तरह से आप उम्मीद करते हैं वह वापस आता है। – NullUserException

2

अपनी टिप्पणी पहले से, क्वेरी आप चलाने के लिए कोशिश कर रहे हैं

Select distinct id from table where id2 =12312 order by time desc. 

मैं उम्मीद थी है, यहाँ समस्या है। कॉलम द्वारा आपका चयन कॉलम और ऑर्डर अलग है। आपकी आउटपुट पंक्तियों को समय के अनुसार आदेश दिया जाता है, लेकिन उस आदेश को आईडी कॉलम में संरक्षित करने की आवश्यकता नहीं होती है। यहाँ एक उदाहरण है।

id | id2 | time 
------------------- 
1 | 12312 | 34 
2 | 12312 | 12 
3 | 12312 | 48 

यदि आप चलाने

SELECT * FROM table WHERE id2=12312 ORDER BY time DESC 

आप निम्नलिखित परिणाम

id | id2 | time 
------------------- 
2 | 12312 | 12 
1 | 12312 | 34 
3 | 12312 | 48 

अब अगर आप इस से केवल आईडी स्तंभ का चयन मिल जाएगा, आप मिल जाएगा

id 
-- 
2 
1 
3 

यही कारण है कि आपके परिणाम हैं क्रमबद्ध नहीं है।

+0

क्या होगा यदि आपके पास एकाधिक आईडी हैं (पूर्व: id = 2 और id = 1 कई बार हुई) जिसे कोई समय के साथ करके चयन करेगा? – insomiac

+0

यदि आप "तालिका से अलग आईडी का चयन करें जहां id2 = 12312 समय desc द्वारा आदेश" चलाया जाता है, तो डुप्लिकेट हटा दिए जाएंगे। यदि आप "तालिका से आईडी का चयन करें जहां id2 = 12312 समय desc द्वारा आदेश" चलाते हैं, तो परिणामों में डुप्लिकेट होंगे। तो आईडी की सभी घटनाएं वापस आ जाएंगी। – srivani

+0

उत्तर देने के लिए धन्यवाद, उदाहरण के लिए यदि मैं समय के अनुसार हालिया आईडी प्राप्त करना चाहता हूं और यदि मैं अलग-अलग आईडी के साथ समय-समय पर कर रहा हूं। यह mysql के साथ काम नहीं कर रहा है। क्या आप जानते हैं कि आदेश के साथ कितना अलग काम करता है? – insomiac

0

आपके द्वारा वर्णित व्यवहार तब होता है जब आप ORDER BY एक अभिव्यक्ति जो SELECT खंड में मौजूद नहीं है। एसक्यूएल मानक ऐसी क्वेरी की अनुमति नहीं देता है लेकिन MySQL कम सख्त है और इसे अनुमति देता है।

SELECT DISTINCT colum1, column2 
FROM table1 
WHERE ... 
ORDER BY column3 

मान लीजिए कि तालिका table1 की सामग्री में है:

एक उदाहरण की कोशिश करते हैं

id | column1 | column2 | column3 
----+---------+---------+--------- 
    1 | A  | B  | 1 
    2 | A  | B  | 5 
    3 | X  | Y  | 3 
ORDER BY खंड के बिना

, ऊपर क्वेरी दो रिकॉर्ड (ORDER BY के आदेश के बिना निम्नलिखित गारंटी नहीं है):

column1 | column2 
---------+--------- 
A  | B 
X  | Y 

लेकिन ORDER BY column3 के साथ आदेश भी गारंटी नहीं है।

DISTINCT खंड SELECT खंड में मौजूद अभिव्यक्तियों के मूल्यों पर कार्य करता है। यदि पंक्ति # 1 को पहले संसाधित किया जाता है तो (A, B) परिणाम सेट में रखा गया है और यह पंक्ति # 1 से जुड़ा हुआ है। फिर, जब पंक्ति # 2 संसाधित हो जाती है, तो SELECT अभिव्यक्तियों के मान रिकॉर्ड (A, B) उत्पन्न करते हैं जो पहले से ही परिणाम सेट में है। DISTINCT की वजह से यह गिरा दिया गया है। पंक्ति # 3 उत्पन्न करता है (X, Y) जिसे परिणाम सेट में भी रखा जाता है। फिर, ORDER BY column3 खंड रिकॉर्ड सेट में क्रमबद्ध किया गया है (A, B), (X, Y)।

लेकिन अगर पंक्ति # 2 से पहले # 1 पंक्ति तो संसाधित किया जाता है, एक ही पिछले पैराग्राफ में अवगत कराया तर्क के बाद, परिणाम सेट में रिकॉर्ड के रूप में (X, Y), (A, B) हल कर रहे हैं।

डेटाबेस इंजन पर कोई नियम लागू नहीं होता है, जब यह क्वेरी चलाता है तो पंक्तियों को संसाधित करता है। डेटाबेस किसी भी क्रम में पंक्तियों को संसाधित करने के लिए स्वतंत्र है, यह मानता है कि यह प्रदर्शन के लिए बेहतर है।

आपकी क्वेरी अमान्य SQL है और तथ्य यह है कि यह एक ही इनपुट डेटा का उपयोग करके अलग-अलग परिणाम लौटा सकता है।

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