यह GROUP BY
के साथ काम क्यों नहीं करता
SELECT *
GROUP BY
. के साथ प्रयोग नहीं किया जा सकता; यह अमान्य एसक्यूएल है। GROUP BY
तालिका पंक्तियों का चयन नहीं करता है। यह प्रदान किए गए भावों का उपयोग करके पंक्तियों के समूह बनाता है, फिर प्रत्येक समूह से, यह एक नया रिकॉर्ड बनाता है और अभिव्यक्ति में शामिल मूल्यों का उपयोग करके इस नए रिकॉर्ड के प्रत्येक कॉलम की गणना करता है।
SELECT
. में दिखने वाले कॉलम खंड को निम्नलिखित नियमों में से एक को पूरा करना चाहिए:
GROUP BY
में भी दिखाई देते हैं खंड;- का उपयोग
GROUP BY
कुल कार्य ; - कार्यात्मक रूप से उन स्तंभों पर निर्भर हैं जो
GROUP BY
. में दिखाई देते हैं खंड।
जबकि *
क्वेरी द्वारा उपयोग की जाने वाली तालिका (तालिकाओं) के सभी कॉलम नामों के लिए एक शॉर्टकट है, केवल आपकी क्वेरी के लिए user
कॉलम उपरोक्त आवश्यकताओं में से एक को पूरा करता है।
संस्करण 5.7.5 से पहले
MySQL ने ऊपर तीसरा नियम लागू नहीं किया। यह उन प्रश्नों को स्वीकार करता था जिनमें SELECT
. होता है क्लॉज कॉलम जो किसी भी GROUP BY
. का पालन नहीं करते हैं आवश्यकताएं। ऐसे कॉलम के लिए क्वेरी द्वारा दिया गया मान indeterminate था
।
संस्करण 5.7.5 के बाद से, MySQL GROUP BY
. को अस्वीकार करता है क्वेरी जो आवश्यकताओं को पूरा करती हैं।
समाधान
किसी भी तरह से, आपकी समस्या के समाधान में GROUP BY
शामिल नहीं है . इसे LEFT JOIN
. का उपयोग करके आसानी से पूरा किया जा सकता है सही शर्तों के साथ:
SELECT lc.*
FROM comments lc # 'lc' from 'last comment'
LEFT JOIN comments nc # 'nc' from 'newer comment'
ON lc.user = nc.user # both comments belong to the same user
AND lc.id < nc.id # 'nc' is newer than 'lc'
WHERE nc.id IS NULL # there is no 'newer comment'
ORDER BY lc.id DESC
LIMIT 10
यह कैसे काम करता है
यह तालिका में शामिल हो जाता है comments
, उपनाम lc
. के रूप में (एक उपयोगकर्ता की "अंतिम टिप्पणी" से "lc") स्वयं के विरुद्ध, जिसका उपनाम nc
. है ("एनसी" से "नई टिप्पणी")। जॉइन क्लॉज lc
. की प्रत्येक प्रविष्टि से मेल खाता है nc
. की सभी प्रविष्टियों के साथ जो एक ही उपयोगकर्ता से संबंधित हैं (lc.user = nc.user
) और नए हैं (lc.id < nc.id
; मुझे लगता है कि आईडी क्रमिक रूप से असाइन किए गए हैं और नई टिप्पणियों में id
. के लिए बड़े मान हैं )।
LEFT JOIN
. का उपयोग सुनिश्चित करता है कि lc
. की प्रत्येक पंक्ति शामिल होने के परिणाम में प्रकट होता है, तब भी जब nc
. में कोई मिलान पंक्ति नहीं मिलती है (क्योंकि एक ही उपयोगकर्ता की कोई नई टिप्पणी नहीं है)। इस मामले में, NULL
nc
. के क्षेत्रों के बजाय प्रयोग किया जाता है . WHERE
क्लॉज अंतिम परिणाम में केवल उन पंक्तियों को सेट करता है जिनमें NULL
है nc.id
. में; इसका मतलब lc
. में है उनमें प्रत्येक उपयोगकर्ता की नवीनतम टिप्पणी शामिल है।
SELECT
क्लॉज में lc
. के सभी क्षेत्र शामिल हैं (उनमें से nc
सभी NULL
हैं , वैसे भी)। ORDER BY
क्लॉज का उपयोग परिणाम सेट को सॉर्ट करने के लिए किया जा सकता है। ORDER BY lc.id DESC
सबसे हाल की टिप्पणियों को पहले रखता है और LIMIT
क्लॉज परिणाम को एक अच्छे आकार में सेट रखता है।