SELECT * FROM my_table GROUP BY section_identifier
एक अमान्य एसक्यूएल
है क्वेरी।
कैसे ग्रुप बाय
काम करता है?
आइए ऊपर क्वेरी प्राप्त करें और देखें कि कैसे GROUP BY
काम करता है। सबसे पहले डेटाबेस इंजन WHERE
. से मेल खाने वाली सभी पंक्तियों का चयन करता है खंड। कोई कहां
नहीं है इस प्रश्न में खंड; इसका मतलब है कि तालिका की सभी पंक्तियों का उपयोग परिणाम सेट उत्पन्न करने के लिए किया जाता है।
इसके बाद यह GROUP BY
. में निर्दिष्ट अभिव्यक्तियों का उपयोग करके पंक्तियों को समूहित करता है खंड:
+----+--------------------+----------------------+----------+
| id | section_identifier | option_identifier | store_id |
+----+--------------------+----------------------+----------+
| 17 | header | header_option_one | 1 |
| 23 | header | header_option_three | 0 |
+----+--------------------+----------------------+----------+
| 18 | footer | footer_option_one | 0 |
+----+--------------------+----------------------+----------+
| 19 | homepage_feature | homepage_feature_one | 0 |
| 25 | homepage_feature | homepage_feature_one | 1 |
+----+--------------------+----------------------+----------+
मैंने सब कुछ स्पष्ट करने के लिए उपरोक्त सूची में समूहों को चिह्नित किया है।
अगले चरण में, प्रत्येक समूह से डेटाबेस इंजन एक पंक्ति . उत्पन्न करता है . लेकिन कैसे?
चुनें
आपकी क्वेरी का खंड चुनें *
. है . *
टेबल कॉलम की पूरी सूची के लिए खड़ा है; इस मामले में, चुनें *
लिखने का एक छोटा तरीका है:
SELECT id, section_identifier, option_identifier, store_id
आइए कॉलम id
. के मानों का विश्लेषण करें पहले समूह के लिए। डेटाबेस इंजन को id
. के लिए कौन सा मान चुनना चाहिए? ? 17
या 23
? क्यों 17
और क्यों 23
?
17
. के पक्ष में इसका कोई मापदंड नहीं है 23
. से अधिक . यह उनमें से केवल एक को चुनता है (शायद 17
लेकिन यह बहुत सारे आंतरिक कारकों पर निर्भर करता है) और एक जाता है।
section_identifier
. के लिए मान निर्धारित करने में कोई समस्या नहीं है . यह GROUP BY
. के लिए उपयोग किया जाने वाला कॉलम है , एक समूह में इसके सभी मान समान होते हैं।
कॉलम option_identifier
. पर चुनने की दुविधा फिर से होती है और store_id
।
मानक के अनुसार एसक्यूएल
आपकी क्वेरी मान्य नहीं है और इसे निष्पादित नहीं किया जा सकता है। हालाँकि, कुछ डेटाबेस इंजन इसे ऊपर बताए अनुसार चलाते हैं। अभिव्यक्तियों के लिए मान जो नहीं हैं (कम से कम नीचे में से एक):
GROUP BY
में उपयोग किया जाता है खंड;GROUP BY<के साथ प्रयोग किया जाता है /कोड> कुल कार्य
चुनें
. में खंड;- कार्यात्मक रूप से
GROUP BY
में उपयोग किए गए स्तंभों पर निर्भर करता है खंड;
अनिश्चित हैं।
संस्करण के बाद से 5.7.5
, MySQL
लागू करता है कार्यात्मक निर्भरता का पता लगाना
और, डिफ़ॉल्ट रूप से, यह एक अमान्य GROUP BY
. को अस्वीकार करता है आपकी तरह क्वेरी।
इसे कैसे काम करें
यह मेरे लिए स्पष्ट नहीं है कि आप परिणाम सेट कैसे प्राप्त करना चाहते हैं। वैसे भी, यदि आप तालिका से कुछ पंक्तियाँ प्राप्त करना चाहते हैं तो GROUP BY
नहीं है करने का सही तरीका। ग्रुप बाय
नहीं तालिका से पंक्तियों का चयन करें, यह तालिका से मानों का उपयोग करके नए मान उत्पन्न करता है। GROUP BY
. द्वारा उत्पन्न एक पंक्ति , ज्यादातर बार, स्रोत तालिका की किसी भी पंक्ति से मेल नहीं खाते।
आप अपनी समस्या का संभावित समाधान इस उत्तर में पा सकते हैं। . विचार को पढ़ने और समझने के बाद आपको स्वयं प्रश्न लिखना होगा (और यह आपके लिए बहुत स्पष्ट है कि "विजेता" पंक्तियों का चयन कैसे किया जाना चाहिए)।