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

MySql में क्वेरी निष्पादित करते समय only_full_group_by से संबंधित त्रुटि

मैं बस 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


  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 संग्रहीत कार्यविधियाँ बनाना और उनका उपयोग करना - एक ट्यूटोरियल

  2. MySQL 'user_id' जहां क्लॉज अस्पष्ट समस्या है

  3. चरित्र सेट और संयोजन का वास्तव में क्या अर्थ है?

  4. बाएँ जॉइन का उपयोग करके MySQL में कई तालिकाओं को अद्यतन करें

  5. एकल कथन में जावा में निष्पादित एकाधिक प्रश्न