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 मानदंडों में कॉलम के कार्यात्मक निर्भरता होना चाहिए। यदि आप इसका पालन नहीं करते हैं, तो यह आपकी गलती है। :-)
मानक एसक्यूएल अधिक सख्त है और कुछ प्रश्नों को अस्वीकार करता है असंबद्ध हो सकता है - संभवतः क्योंकि आरडीबीएमएस सामान्य रूप से सुनिश्चित होना बहुत जटिल होगा।
नहीं, MySQL समूह में पहली पंक्ति से मूल्य लौटाता है। ऑर्डर द्वारा समूहों के गठन के बाद पंक्तियों पर लागू किया जाता है - यह समूह के भीतर पंक्तियों के क्रम को प्रभावित नहीं करता है। –
मैं सही खड़ा हूं :) – Charles