यह एक क्लासिक बाधा है जिससे अधिकांश 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 लौटाता है।