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

GROUP BY का उपयोग करते समय MYSQL गलत पंक्तियाँ दिखाता है

यह एक क्लासिक बाधा है जिससे अधिकांश MySQL प्रोग्रामर टकराते हैं।

  • आपके पास एक कॉलम है ticket_id GROUP BY . का यही तर्क है . इस कॉलम में अलग-अलग मान समूहों को परिभाषित करते हैं।
  • आपके पास एक कॉलम है incoming_time MAX() . का यही तर्क है . प्रत्येक समूह में पंक्तियों पर इस कॉलम में सबसे बड़ा मान MAX() . के मान के रूप में दिया जाता है ।
  • आपके पास टेबल आलेख के अन्य सभी कॉलम हैं। इन स्तंभों के लिए लौटाए गए मान मनमाना हैं, न कि उसी पंक्ति से जहां MAX() मान होता है।

डेटाबेस यह अनुमान नहीं लगा सकता है कि आप उसी पंक्ति से मान चाहते हैं जहां अधिकतम मान होता है।

निम्नलिखित मामलों के बारे में सोचें:

  • ऐसी कई पंक्तियाँ हैं जहाँ समान अधिकतम मान होता है। article.* . के स्तम्भों को दिखाने के लिए किस पंक्ति का प्रयोग करना चाहिए? ?

  • आप एक क्वेरी लिखते हैं जो MIN() . दोनों लौटाती है और MAX() . यह कानूनी है, लेकिन किस पंक्ति में article.* होना चाहिए दिखाओ?

    SELECT article.* , MIN(article.incoming_time), MAX(article.incoming_time)
    FROM ticket, article
    WHERE ticket.id = article.ticket_id
    AND ticket.queue_id = 1
    GROUP BY article.ticket_id
    
  • आप एक समग्र फ़ंक्शन का उपयोग करते हैं जैसे AVG() या SUM() , जहां किसी भी पंक्ति का वह मान नहीं है। डेटाबेस कैसे अनुमान लगाता है कि किस पंक्ति को प्रदर्शित करना है?

    SELECT article.* , AVG(article.incoming_time)
    FROM ticket, article
    WHERE ticket.id = article.ticket_id
    AND ticket.queue_id = 1
    GROUP BY article.ticket_id
    

डेटाबेस के अधिकांश ब्रांडों में -- साथ ही स्वयं SQL मानक में -- आपको अनुमति नहीं है अस्पष्टता के कारण इस तरह की एक क्वेरी लिखने के लिए। आप चयन-सूची में कोई भी कॉलम शामिल नहीं कर सकते जो एक समग्र फ़ंक्शन के अंदर नहीं है या GROUP BY में नामित है खंड।

MySQL अधिक अनुमेय है। यह आपको ऐसा करने देता है, और अस्पष्टता के बिना प्रश्न लिखने के लिए इसे आप पर छोड़ देता है। यदि आपके पास अस्पष्टता है, तो यह उस पंक्ति से मानों का चयन करता है जो समूह में भौतिक रूप से पहले हैं (लेकिन यह स्टोरेज इंजन पर निर्भर है)।

इसके लायक क्या है, SQLite में भी यह व्यवहार है, लेकिन यह अंतिम . चुनता है अस्पष्टता को हल करने के लिए समूह में पंक्ति। जाओ पता लगाओ। यदि SQL मानक यह नहीं बताता कि क्या करना है, तो यह विक्रेता के कार्यान्वयन पर निर्भर करता है।

यहां एक प्रश्न है जो आपके लिए आपकी समस्या का समाधान कर सकता है:

SELECT a1.* , a1.incoming_time AS maxtime
FROM ticket t JOIN article a1 ON (t.id = a1.ticket_id)
LEFT OUTER JOIN article a2 ON (t.id = a2.ticket_id 
  AND a1.incoming_time < a2.incoming_time)
WHERE t.queue_id = 1
  AND a2.ticket_id IS NULL;

दूसरे शब्दों में, एक पंक्ति देखें (a1 ) जिसके लिए कोई अन्य पंक्ति नहीं है (a2 ) उसी ticket_id . के साथ और बेहतर incoming_time . यदि अधिक नहीं incoming_time पाया जाता है, LEFT OUTER JOIN मैच के बजाय NULL लौटाता है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL एक सरणी में विशिष्ट JSON ऑब्जेक्ट को अपडेट करता है

  2. Mysql द्वारा आदेश हटाएं

  3. सफल MySQL/MariaDB बैकअप और पुनर्प्राप्ति रणनीतियाँ

  4. mysqld_safe निर्देशिका '/var/run/mysqld' UNIX सॉकेट फ़ाइल के लिए मौजूद नहीं है

  5. अतिरिक्त क्षेत्रों के साथ एचएबीटीएम सहेजा जा रहा है?