GROUP BY
बिना किसी समुच्चय फ़ंक्शन का उपयोग करते हुए संभावित अप्रत्याशित परिणामों से बचने के लिए , जैसा कि स्वीकृत उत्तर में उपयोग किया जाता है , क्योंकि MySQL एक समुच्चय फ़ंक्शन [sic] का उपयोग नहीं करते हुए समूहीकृत डेटा सेट के भीतर किसी भी मूल्य को पुनः प्राप्त करने के लिए स्वतंत्र है और मुद्दों के साथ । कृपया बहिष्करण जॉइन का उपयोग करने पर विचार करें।ONLY_FULL_GROUP_BY
बहिष्करण में शामिल हों - अस्पष्ट इकाइयाँ
प्रथमनाम और अंतिमनाम को विशिष्ट रूप से अनुक्रमित (असंदिग्ध) मानकर, परिणाम सेट को फ़िल्टर करने के GROUP BY
लिए सॉर्ट करने के लिए एक विकल्प है LEFT JOIN
, अन्यथा एक बहिष्करण JOIN के रूप में जाना जाता है।
प्रदर्शन देखें
आरोही क्रम (AZ)
AZ से lastname द्वारा दिए गए पहले फर्स्टनाम को पुनः प्राप्त करने के लिए
सवाल
SELECT t1.*
FROM table_name AS t1
LEFT JOIN table_name AS t2
ON t1.firstname = t2.firstname
AND t1.lastname > t2.lastname
WHERE t2.id IS NULL;
परिणाम
| id | firstname | lastname |
|----|-----------|----------|
| 2 | Bugs | Bunny |
| 1 | John | Doe |
अवरोही क्रम (ZA)
ZA से lastname द्वारा दिए गए पहले फर्स्टनाम को पुनः प्राप्त करने के लिए
सवाल
SELECT t1.*
FROM table_name AS t1
LEFT JOIN table_name AS t2
ON t1.firstname = t2.firstname
AND t1.lastname < t2.lastname
WHERE t2.id IS NULL;
परिणाम
| id | firstname | lastname |
|----|-----------|----------|
| 2 | Bugs | Bunny |
| 3 | John | Johnson |
तब आप परिणामी डेटा को इच्छानुसार ऑर्डर कर सकते हैं।
बहिष्करण में शामिल हों - अस्पष्ट इकाइयाँ
यदि पहला और अंतिम नाम संयोजन अद्वितीय (अस्पष्ट) नहीं है और आपके पास समान मानों की एक से अधिक पंक्तियाँ हैं, तो आप परिणाम को फ़िल्टर करने के लिए JOIN मानदंड पर एक शर्त शामिल करके आईडी द्वारा फ़िल्टर भी कर सकते हैं।
प्रदर्शन देखें
table_name डेटा
(1, 'John', 'Doe'),
(2, 'Bugs', 'Bunny'),
(3, 'John', 'Johnson'),
(4, 'John', 'Doe'),
(5, 'John', 'Johnson')
सवाल
SELECT t1.*
FROM table_name AS t1
LEFT JOIN table_name AS t2
ON t1.firstname = t2.firstname
AND (t1.lastname > t2.lastname
OR (t1.firstname = t1.firstname AND t1.lastname = t2.lastname AND t1.id > t2.id))
WHERE t2.id IS NULL;
परिणाम
| id | firstname | lastname |
|----|-----------|----------|
| 1 | John | Doe |
| 2 | Bugs | Bunny |
सबक्वीरी का आदेश दिया
संपादित करें
एक आदेशित उपशम का उपयोग करते हुए मेरा मूल उत्तर , MySQL 5.7.5 से पहले लिखा गया था , जो कि अब लागू नहीं है, इसके परिवर्तनों के कारण ONLY_FULL_GROUP_BY
। कृपया इसके बजाय ऊपर दिए गए उदाहरणों में शामिल होने के बहिष्करण का उपयोग करें।
यह नोट करना भी महत्वपूर्ण है; जब ONLY_FULL_GROUP_BY
अक्षम किया जाता है (MySQL 5.7.5 से पहले मूल व्यवहार) , GROUP BY
एक कुल कार्य के बिना उपयोग अप्रत्याशित परिणाम प्राप्त कर सकता है, क्योंकि MySQL समूहीकृत डेटा सेट के भीतर किसी भी मूल्य को चुनने के लिए स्वतंत्र है [sic] ।
अर्थ ID
या lastname
मान को पुनः प्राप्त किया जा सकता है जो पुनः प्राप्त पंक्ति से संबद्ध नहीं हैfirstname
।
चेतावनी
MySQL के GROUP BY
साथ प्रयोग किए जाने पर अपेक्षित परिणाम नहीं मिल सकता हैORDER BY
देखें टेस्ट केस का उदाहरण
कार्यान्वयन का सबसे अच्छा तरीका, अपेक्षित परिणाम सुनिश्चित करने के लिए, एक आदेशित उपवर्ग का उपयोग करके परिणाम सेट गुंजाइश को फ़िल्टर करना है।
table_name डेटा
(1, 'John', 'Doe'),
(2, 'Bugs', 'Bunny'),
(3, 'John', 'Johnson')
सवाल
SELECT * FROM (
SELECT * FROM table_name ORDER BY ID DESC
) AS t1
GROUP BY FirstName
परिणाम
| ID | first | last |
|----|-------|---------|
| 2 | Bugs | Bunny |
| 3 | John | Johnson |
तुलना
के GROUP BY
साथ संयोजन में उपयोग करते समय अप्रत्याशित परिणाम प्रदर्शित करने के लिएORDER BY
सवाल
SELECT * FROM table_name GROUP BY FirstName ORDER BY ID DESC
परिणाम
| ID | first | last |
|----|-------|-------|
| 2 | Bugs | Bunny |
| 1 | John | Doe |