मैं बस group_id
जोड़ूंगा GROUP BY
. के लिए .
जब SELECT
एक कॉलम में जो GROUP BY
. का हिस्सा नहीं है समूहों के भीतर उस कॉलम के लिए कई मान हो सकते हैं, लेकिन परिणामों में केवल एक मान के लिए स्थान होगा। तो, डेटाबेस आमतौर पर उन एकाधिक मानों को एक मान में कैसे बनाया जाए, यह ठीक-ठीक बताया जाना चाहिए। आमतौर पर, यह COUNT()
. जैसे समग्र कार्य के साथ किया जाता है , SUM()
, MAX()
आदि... मैं कहता हूँ आमतौर पर क्योंकि अधिकांश अन्य लोकप्रिय डेटाबेस सिस्टम इस पर जोर देते हैं। हालाँकि, संस्करण 5.7 से पहले MySQL में डिफ़ॉल्ट व्यवहार अधिक क्षमाशील रहा है क्योंकि यह शिकायत नहीं करेगा और फिर मनमाने ढंग से कोई भी मान चुनेंगे। ! इसमें एक ANY_VALUE()
भी है फ़ंक्शन जिसे इस प्रश्न के दूसरे समाधान के रूप में इस्तेमाल किया जा सकता है यदि आपको वास्तव में पहले जैसा ही व्यवहार चाहिए। यह लचीलापन लागत पर आता है क्योंकि यह गैर-नियतात्मक है, इसलिए मैं इसकी अनुशंसा नहीं करता जब तक कि आपके पास इसकी आवश्यकता के लिए बहुत अच्छा कारण न हो। MySQL अब only_full_group_by
को चालू कर रहा है अच्छे कारणों के लिए डिफ़ॉल्ट रूप से सेटिंग, इसलिए इसका उपयोग करना और अपने प्रश्नों को इसका अनुपालन करना सबसे अच्छा है।
तो मेरा सरल उत्तर ऊपर क्यों? मैंने कुछ अनुमान लगाए हैं:
1) group_id
निराला है। उचित लगता है, आखिर यह एक 'आईडी' है।
2) group_name
अद्वितीय भी है। यह इतनी उचित धारणा नहीं हो सकती है। अगर ऐसा नहीं है और आपके पास कुछ डुप्लीकेट group_names
. हैं और फिर आप group_id
. जोड़ने के लिए मेरी सलाह का पालन करें GROUP BY
. को , आप पा सकते हैं कि अब आपको पहले की तुलना में अधिक परिणाम मिलते हैं क्योंकि समान नाम वाले समूहों की अब परिणामों में अलग पंक्तियाँ होंगी। मेरे लिए, इन डुप्लिकेट समूहों को छिपाने से बेहतर होगा क्योंकि डेटाबेस ने चुपचाप एक मान को मनमाने ढंग से चुना है!
एक से अधिक टेबल शामिल होने पर सभी कॉलम को उनके टेबल नाम या उपनाम के साथ अर्हता प्राप्त करना भी अच्छा अभ्यास है...
SELECT
g.group_id AS 'value',
g.group_name AS 'text'
FROM mod_users_groups g
LEFT JOIN mod_users_data d ON g.group_id = d.group_id
WHERE g.active = 1
AND g.department_id = 1
AND g.manage_work_orders = 1
AND g.group_name != 'root'
AND g.group_name != 'superuser'
GROUP BY
g.group_name,
g.group_id
HAVING COUNT(d.user_id) > 0
ORDER BY g.group_name