2009-10-29 14 views
13

द्वारा निम्न तालिका 'foo'MySQL ग्रुप व्यवहार

ID | First Name | Last Name 
---------------------------- 
67 John  Smith 
---------------------------- 
67 Bill  Jacobs 

क्या first_name और last_name होगा निम्न क्वेरी वापसी और क्यों देखते हुए?

SELECT * FROM foo WHERE ID = 67 GROUP BY ID 

उत्तर

0

यह बहुत संभावना है कि दूसरी (आखिरी) पंक्ति का पहला नाम और अंतिम नाम चुना जाएगा।

आप समूहों द्वारा क्रमबद्ध पंक्तियों को कैसे क्रमबद्ध करना चाहते हैं, इस पर संकेत देने के लिए आप एक आदेश द्वारा ऑर्डर कर सकते हैं।

+2

नहीं, MySQL समूह में पहली पंक्ति से मूल्य लौटाता है। ऑर्डर द्वारा समूहों के गठन के बाद पंक्तियों पर लागू किया जाता है - यह समूह के भीतर पंक्तियों के क्रम को प्रभावित नहीं करता है। –

+0

मैं सही खड़ा हूं :) – Charles

4

MySQLs समूह मानक SQL व्यवहार के अनुरूप नहीं है, MySQL अन्य कॉलम प्राप्त करना आसान बनाता है लेकिन साथ ही आप कभी भी यह सुनिश्चित नहीं कर सकते कि आपको कौन सा मिलेगा।

अद्यतन: इस पेज का संदर्भ लें: http://dev.mysql.com/doc/refman/5.0/en/group-by-handling.html

इस सुविधा का उपयोग कर, सभी पंक्तियों में प्रत्येक समूह कॉलम वह हिस्सा द्वारा ग्रुप से लोप कर रहे हैं के लिए एक ही मान होना चाहिए। समूह समूह से किसी भी मूल्य को वापस करने के लिए मुफ्त है, इसलिए परिणाम तब तक अनिश्चित हैं जब तक सभी मान समान नहीं हैं।

0

मानक SQL में, यह एसक्यूएल की तरह

"firstname एक सर्वर प्रोसेसर त्रुटि कुछ के साथ विफल करना चाहिए, और उपनाम का चयन खंड में शामिल नहीं किया जा सकता जब तक कि वे समूह तक में भी कर रहे हैं, या हिस्सा हैं कुल कार्य का। "

क्या MySQL वास्तव में इसके लिए डेटा लौटाता है?

+0

हां, MySQL आपको यह – Greg

3

यह अनिर्धारित है, जिसके परिणामस्वरूप आप प्राप्त करेंगे।

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

26

MySQL मनमाने ढंग से एक पंक्ति चुनता है। अभ्यास में, सामान्य रूप से उपयोग किए जाने वाले MySQL स्टोरेज इंजन भौतिक भंडारण के संबंध में समूह में पहले पंक्ति से मान वापस कर देते हैं।

create table foo (id serial primary key, category varchar(10)); 

insert into foo (category) values 
    ('foo'), ('foo'), ('foo'), ('bar'), ('bar'), ('bar'); 

select * from foo group by category; 

+----+----------+ 
| id | category | 
+----+----------+ 
| 4 | bar  | 
| 1 | foo  | 
+----+----------+ 

अन्य लोगों सही हैं कि MySQL आप इस क्वेरी भले ही यह मनमाने ढंग से और संभावित परिणाम भ्रामक है चलाने के लिए अनुमति देता है। एसक्यूएल मानक, और अधिकांश अन्य आरडीबीएमएस विक्रेताओं, इस तरह के संदिग्ध ग्रुप बाय क्वेरी को अस्वीकार करते हैं। इसे सिंगल-वैल्यू नियम कहा जाता है: चयन सूची में सभी कॉलम ग्रुप बाय मानदंडों का स्पष्ट रूप से हिस्सा होना चाहिए, या अन्यथा एक समग्र फ़ंक्शन के अंदर होना चाहिए, उदा। COUNT(), MAX(), आदि

MySQL एक एसक्यूएल मोड ONLY_FULL_GROUP_BY MySQL एक त्रुटि वापसी अगर आप एक प्रश्न है कि SQL मानक अर्थ विज्ञान का उल्लंघन करता है चलाने का प्रयास करता है कि समर्थन करता है।

AFAIK, SQLite एकमात्र अन्य आरडीबीएमएस है जो समूहबद्ध क्वेरी में अस्पष्ट कॉलम की अनुमति देता है।SQLite समूह में पिछले पंक्ति से मानों रिटर्न:

select * from foo group by category; 

6|bar 
3|foo 

हम प्रश्नों कि अस्पष्ट नहीं होगा, फिर भी अभी भी एसक्यूएल मानक अर्थ विज्ञान का उल्लंघन कल्पना कर सकते हैं।

SELECT foo.*, parent_of_foo.* 
FROM foo JOIN parent_of_foo 
    ON (foo.parent_id = parent_of_foo.parent_id) 
GROUP BY foo_id; 

कोई तार्किक तरीका नहीं है जिससे यह संदिग्ध परिणाम उत्पन्न कर सके। अगर हम foo की प्राथमिक कुंजी से ग्रुप करते हैं तो foo में प्रत्येक पंक्ति अपना समूह प्राप्त करती है। इसलिए foo से किसी भी कॉलम में समूह में केवल एक ही मूल्य हो सकता है। यहां तक ​​कि foo में किसी विदेशी कुंजी द्वारा संदर्भित किसी अन्य तालिका में शामिल होने के लिए प्रति समूह केवल एक मान हो सकता है, यदि समूह को foo की प्राथमिक कुंजी द्वारा परिभाषित किया गया हो।

MySQL और SQLite आपको तार्किक रूप से स्पष्ट प्रश्नों को डिज़ाइन करने के लिए भरोसा करते हैं। औपचारिक रूप से, चयन सूची में प्रत्येक कॉलम ग्रुप BY मानदंडों में कॉलम के कार्यात्मक निर्भरता होना चाहिए। यदि आप इसका पालन नहीं करते हैं, तो यह आपकी गलती है। :-)

मानक एसक्यूएल अधिक सख्त है और कुछ प्रश्नों को अस्वीकार करता है असंबद्ध हो सकता है - संभवतः क्योंकि आरडीबीएमएस सामान्य रूप से सुनिश्चित होना बहुत जटिल होगा।

+3

करने की अनुमति देता है आपको इस उत्तर के लिए एक महान पुरस्कार प्राप्त करना चाहिए। – Kermit

0

MySQLs समूह द्वारा मानक SQL व्यवहार के अनुरूप नहीं है, MySQL आसान अन्य स्तंभों प्राप्त करने के लिए, लेकिन एक ही समय में यू कभी नहीं यकीन है कि जो एक यू मिल जाएगा हो सकता है बनाता है।

सच। असल में यह पोस्टग्रेस में मोड पर चयन डिस्टिंट पर अधिक से मेल खाता है, सिवाय इसके कि आपको विशिष्टता (?) से पहले पंक्तियों का क्रम निर्दिष्ट करने की अनुमति मिलती है और इसलिए आपको कौन सी पंक्ति मिल जाएगी (यानी सबसे हालिया, सबसे पुरानी, ​​जो भी हो)।

नोट "एसक्यूएल अनुपालन" मोड में MySQL नोट आपके उदाहरण के रूप में गैर-निर्दिष्ट कॉलम के साथ ग्रुप BY को अस्वीकार कर देगा।

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