Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

डीईएससी द्वारा ग्रुप अपने आदेश का चयन कैसे करता है?

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

मानक के अनुसार एसक्यूएल आपकी क्वेरी मान्य नहीं है और इसे निष्पादित नहीं किया जा सकता है। हालाँकि, कुछ डेटाबेस इंजन इसे ऊपर बताए अनुसार चलाते हैं। अभिव्यक्तियों के लिए मान जो नहीं हैं (कम से कम नीचे में से एक):

अनिश्चित हैं।

संस्करण के बाद से 5.7.5 , MySQL लागू करता है कार्यात्मक निर्भरता का पता लगाना और, डिफ़ॉल्ट रूप से, यह एक अमान्य GROUP BY . को अस्वीकार करता है आपकी तरह क्वेरी।

इसे कैसे काम करें

यह मेरे लिए स्पष्ट नहीं है कि आप परिणाम सेट कैसे प्राप्त करना चाहते हैं। वैसे भी, यदि आप तालिका से कुछ पंक्तियाँ प्राप्त करना चाहते हैं तो GROUP BY नहीं है करने का सही तरीका। ग्रुप बाय नहीं तालिका से पंक्तियों का चयन करें, यह तालिका से मानों का उपयोग करके नए मान उत्पन्न करता है। GROUP BY . द्वारा उत्पन्न एक पंक्ति , ज्यादातर बार, स्रोत तालिका की किसी भी पंक्ति से मेल नहीं खाते।

आप अपनी समस्या का संभावित समाधान इस उत्तर में पा सकते हैं। . विचार को पढ़ने और समझने के बाद आपको स्वयं प्रश्न लिखना होगा (और यह आपके लिए बहुत स्पष्ट है कि "विजेता" पंक्तियों का चयन कैसे किया जाना चाहिए)।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. java.sql.SQLException:लोकलहोस्ट टेस्ट के लिए कोई उपयुक्त ड्राइवर नहीं मिला

  2. MYSQL अद्यतन सेट एक ही कॉलम पर लेकिन कई WHERE क्लॉज के साथ

  3. MySQL में एक स्ट्रिंग में एकाधिक रिक्त स्थान जोड़ने का सबसे आसान तरीका - SPACE ()

  4. MYSQL तालिका को अनलॉक कैसे करें यदि मैंने कमांड का उपयोग किया है LOCK तालिका table_name WRITE;

  5. पायथन आयात MySQLdb त्रुटि - मैक 10.6