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


442

मैंने अपने सिस्टम को अपग्रेड किया है और मैंने जिस वेब एप्लिकेशन पर काम कर रहा हूं, उसके लिए MySql 5.7.9 को php के साथ इंस्टॉल किया है। मेरे पास एक क्वेरी है जो गतिशील रूप से बनाई गई है, और जब MySql के पुराने संस्करणों में चलाया जाता है तो यह ठीक काम करता है। 5.7 में अपग्रेड करने के बाद से मुझे यह त्रुटि मिली:

SELECT लिस्ट का एक्सप्रेशन # 1 GROUP BY क्लॉज में नहीं है और इसमें नॉनग्रिगेटेड कॉलम 'support_desk.mod_users_groups.group_id' शामिल है, जो ग्रुप BY क्लॉज में कॉलम पर कार्यात्मक रूप से निर्भर नहीं है; यह sql_mode = only_full_group_by के साथ असंगत है

सर्वर SQL मोड्स के विषय पर मैसूर 5.7 के लिए मैनुअल पेज पर ध्यान दें ।

यह प्रश्न है जो मुझे परेशान कर रहा है:

SELECT mod_users_groups.group_id AS 'value', 
       group_name AS 'text' 
FROM mod_users_groups
LEFT JOIN mod_users_data ON mod_users_groups.group_id = mod_users_data.group_id 
WHERE  mod_users_groups.active = 1 
  AND mod_users_groups.department_id = 1 
  AND mod_users_groups.manage_work_orders = 1 
  AND group_name != 'root' 
  AND group_name != 'superuser' 
GROUP BY group_name 
HAVING COUNT(`user_id`) > 0 
ORDER BY group_name

मैंने इस मुद्दे पर कुछ गुगली की, लेकिन मुझे यह समझने के लिए only_full_group_byपर्याप्त नहीं है कि क्वेरी को ठीक करने के लिए मुझे क्या करने की आवश्यकता है। क्या मैं only_full_group_byविकल्प को बंद कर सकता हूं , या क्या मुझे कुछ और करने की आवश्यकता है?

कृपया मुझे बताएं कि क्या आपको और अधिक जानकारी चाहिये?


यहाँ मैंने समाधान stackoverflow.com/a/7588442/612987
वसीम ए।

21
यह सबसे जटिल त्रुटि संदेश है जो मुझे कभी भी आया था।
रॉल्फ

2
@ रॉल्फ क्या आपने ओरेकल में एक ही प्रकार की समस्या के लिए त्रुटि देखी है? " not a GROUP BY expression" वह तो है। उनके पास बस एक संख्यात्मक त्रुटि कोड और कोई संदेश नहीं हो सकता है।
बिल कार्विन

जवाबों:


359

मैं सिर्फ जोड़ना होगा group_idकरने के लिए GROUP BY

जब SELECTएक स्तंभ है कि का हिस्सा नहीं है ing 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

धन्यवाद, यह सही काम करता है। मैं इस बात से भी सहमत हूं कि मुझे कॉलम को क्वालिफाई करने की जरूरत है। यह अस्पष्टता की किसी भी संभावना को समाप्त करता है। मैं अब कोड को सुधारने की प्रक्रिया में हूं। मदद के लिए एक लाख धन्यवाद।
डैन बेमॉस्की

मुझे GROUP BYअपने प्रश्न में एक खंड भी नहीं है , फिर भी मुझे यह त्रुटि मिल रही है।
अनीखन

@ शेरोनखान, जो एक नए प्रश्न की तरह लगता है। मुझे बताएं कि क्या आप इसे पूछते हैं और मैं देख लूंगा।
davmos

2
MySQL 5.7 में वे एक संपत्ति सेट करते हैं, जिसमें सभी गैर-समुच्चय वाले फ़ील्ड की आवश्यकता होती है, जो कि एक ग्रुप बीवाई हो। तो एक क्वेरी जैसे SELECT a, SUM (b) टेबल से; इसका मतलब है कि फ़ील्ड "ए" एक ग्रुप बीवाई में होना चाहिए। इसलिए यदि आपके पास ग्रुप बाय नहीं है, तो आपको इसे क्वेरी में जोड़ना होगा। यदि आपके पास अपनी क्वेरी के SELECT हिस्से में कम से कम एक समग्र फ़ील्ड है, तो यह सब के बारे में है।
user1567291

मुझे इस उत्तर में दिए गए खंड के अनुसार समूह में आइटम जोड़कर "चेतावनी" को ठीक करना था क्योंकि sql_mode फिक्सेस का सुझाव देने वाले किसी भी उत्तर ने काम नहीं किया। (मेरा MySQL एक संग्रहीत कार्यविधि में था, लेकिन पता नहीं था कि यह प्रासंगिक था)
zzapper

355

आप only_full_group_byनिम्नलिखित को निष्पादित करके सेटिंग को अक्षम करने का प्रयास कर सकते हैं :

mysql> set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
mysql> set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

MySQL 8 स्वीकार नहीं करता है NO_AUTO_CREATE_USERइसलिए इसे हटाने की आवश्यकता है।


85
यह एक काम के आसपास है, आप चेतावनी को
शांत

1
/Etc/mysql/my.cnf को अपडेट करना (जैसा कि नीचे देखा गया है) अधिक टिकाऊ समाधान है क्योंकि डिफ़ॉल्ट सेटिंग्स पुनः आरंभ करने के बाद वापस आ जाती हैं। और उन लोगों के लिए जो कहते हैं कि आपको क्वेरी को ठीक करना चाहिए, तब यह कभी-कभी आसान नहीं होता है जब आपको त्वरित डिबगिंग क्वेरी की आवश्यकता होती है SELECT COUNT(*), t.* FROM my_table t GROUP BY colऔर जैसे काम करते हैं और आपके पास 20-50 कॉलम होते हैं, क्या आप उस समय को प्रत्येक कॉलम को जोड़ने में खर्च करना चाहते हैं? समूह द्वारा?
शैडैब

3
यह "समाधान" काफी खतरनाक है। आप उन मोड को सक्रिय कर सकते हैं, जिन्हें आपने पहले से नेत्रहीन रूप से बदलकर अक्षम कर दिया था, बजाय केवल प्रश्न में एक सेटिंग ध्वज को हटाने के। इससे अप्रत्याशित व्यवहार हो सकता है और सबसे खराब स्थिति में गलत परिणाम हो सकते हैं या आपके ऐप को पूरी तरह से काम करने से रोक सकते हैं। इस प्रकार मैं इस उत्तर को गलत मानता हूं।
क्रिस एस।

1
मैंने अपने वर्तमान sql_mode का पता SELECT @@sql_mode;लगाकर और फिर वहाँ से परिणाम को जोड़कर इसे ताज़ा करने के लिए लगातार प्रयास किया । परिणाम मेरे sql_mode=[list of modes from query, minus ONLY_FULL_GROUP_BY]
my.nf पर

323

आप अन्य उत्तरों में बताए अनुसार चेतावनी संदेश को बंद कर सकते हैं या आप समझ सकते हैं कि क्या हो रहा है और इसे ठीक करें।

MySQL 5.7.5 के रूप में, डिफ़ॉल्ट SQL मोड में ONLY_FULL_GROUP_BY शामिल है, जिसका अर्थ है कि जब आप पंक्तियों को समूहीकृत कर रहे हैं और फिर उस समूह में से कुछ का चयन कर रहे हैं, तो आपको स्पष्ट रूप से यह कहना होगा कि किस पंक्ति से चयन किया जाना चाहिए। मैसकल को यह जानना होगा कि आप जिस समूह की तलाश कर रहे हैं, उसमें कौन सी पंक्ति है, जो आपको दो विकल्प देती है

मैसकल को यह जानना होगा कि आप जिस समूह की तलाश कर रहे हैं, उसमें कौन सी पंक्ति है, जो आपको दो विकल्प देती है

  • आप उस कॉलम को भी जोड़ सकते हैं जिसे आप समूह विवरण के लिए चाहते हैं, group by rect.color, rect.valueजो कुछ मामलों में आप चाहते हैं, अन्यथा वही रंग के साथ डुप्लिकेट परिणाम लौटाएगा जो आप नहीं चाहते हैं
  • आप यह भी बता सकते हैं कि पूरी सूची जैसे समूहों के अंदर आप किस पंक्ति की ओर संकेत करने के लिए mysql के कुल कार्यों का उपयोग कर सकते हैंAVG() MIN() MAX()
  • और अंत में आप उपयोग कर सकते हैं ANY_VALUE()यदि आप सुनिश्चित हैं कि समूह के अंदर सभी परिणाम समान हैं। दस्तावेज़

25
मुझे नहीं लगता कि MySQL FIRST()पद्धति / फ़ंक्शन का समर्थन करता है?
बेन गिल्ड

3
मेरा मानना ​​है कि MySQL (कम से कम 5.7 से पहले) एक समूह में पहला मूल्य पाने के लिए चूक करता है। इसलिए, FIRST () नहीं है क्योंकि यह ग्रुप बीवाई फ़ंक्शन के साथ पर्यायवाची हुआ करता था।
DrDamnit

2
@DrDamnit, मेरा मानना ​​है कि यह ऐसे मामलों में यादृच्छिक चयन की तरह अधिक था, जिससे भ्रम पैदा हुआ और इस तरह ONLY_FULL_GROUP_BYडिफ़ॉल्ट रूप से सक्षम हो गया
azerafati 7

6
मुझे पहले से ही इसका उत्तर पता था, लेकिन रंगीन आयत के साथ उदाहरण को समझना बहुत आसान है, मैं अगली बार इसका इस्तेमाल करूंगा जब कोई मुझसे इसके बारे में पूछेगा।
user327961

@azerafati एफआईआरएसटी () या कुछ क्वेरी की तरह है जिसका उपयोग मेरे साथ पहले मूल्य के रूप में किया जा सकता है।
हारिस

169

यदि आप अपनी वर्तमान क्वेरी में कोई बदलाव नहीं करना चाहते हैं तो नीचे दिए गए चरणों का पालन करें -

  1. अपने बॉक्स में योनि ssh
  2. प्रकार: sudo vim /etc/mysql/my.cnf
  3. फ़ाइल के नीचे स्क्रॉल करें और Aइंसर्ट मोड दर्ज करने के लिए टाइप करें
  4. प्रतिलिपि करें और चिपकाएं

    [mysqld]
    sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
    
  5. escइनपुट मोड से बाहर निकलने के लिए टाइप करें

  6. :wqबचाने के लिए टाइप करें और विम को बंद करें।
  7. sudo service mysql restartMySQL को रिस्टार्ट करने के लिए टाइप करें।

AdonisJS के साथ इसका उपयोग करने की कोशिश करने वाले सभी वैग्रांट उपयोगकर्ताओं के लिए बस एक सिर है जिसे आपको paginateफ़ंक्शन चलाने के लिए इसकी आवश्यकता है।
माइकल जे। कल्किंस

यह स्पष्ट रूप से केवल वैगरेंट उपयोगकर्ताओं के लिए नहीं है, बल्कि किसी भी यूनिक्स प्रणाली के लिए है। ध्यान दें कि मेरे लिए my.cnfफ़ाइल का स्थान था /etc। Als ने नए सिंटैक्स पर ध्यान दियाMySQL 5.7.8: sql-mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
वैलेंटाइन ग्राईयर

मेरे लिए मिंट 19.3 (ubuntu 18.04) धन्यवाद में काम करता है
मार्को लोपेज़

71

ANY_VALUE()गैर-स्तंभित स्तंभ को संदर्भित करने के लिए उपयोग करें ।

SELECT name,           address , MAX(age) FROM t GROUP BY name; -- fails
SELECT name, ANY_VALUE(address), MAX(age) FROM t GROUP BY name; -- works

से MySQL 5.7 डॉक्स :

आप गैर-स्तंभित कॉलम को संदर्भित ONLY_FULL_GROUP_BY करके उपयोग किए बिना उसी प्रभाव को प्राप्त कर सकते हैं ANY_VALUE()

...

यह क्वेरी ONLY_FULL_GROUP_BYसक्षम होने के साथ अमान्य हो सकती है क्योंकि चयन सूची में गैर-अलग पते वाले कॉलम का नाम GROUP BYखंड में नहीं है :

SELECT name, address, MAX(age) FROM t GROUP BY name;

...

यदि आप जानते हैं कि किसी दिए गए डेटा सेट के लिए, प्रत्येक नाम का मूल्य वास्तव में पता मूल्य को निर्धारित करता है, तो पता प्रभावी रूप से कार्यात्मक रूप से नाम पर निर्भर है। क्वेरी स्वीकार करने के लिए MySQL बताने के लिए, आप ANY_VALUE()फ़ंक्शन का उपयोग कर सकते हैं :

SELECT name, ANY_VALUE(address), MAX(age) FROM t GROUP BY name;

1
जैसा कि कोई है जो इस मामले में कुछ समय से चल रहा था - मुझे विशेष रूप से यह समाधान पसंद है क्योंकि इसके लिए आपको अपने MySQL सेटअप में किसी भी फाइल या सेटिंग्स को बदलने की आवश्यकता नहीं है। दिलचस्प रूप से पर्याप्त है, मैं ANY_VALUE समान चर्चाओं में कहीं और उल्लेख नहीं करता हूं - अपनी GROUP_BY contains nonaggregated columnत्रुटि के साथ मेरे लिए पूरी तरह से काम करता है ।
adstwlearn

50

मैं आपको यह समझाने की कोशिश करूंगा कि यह त्रुटि क्या है।
MySQL 5.7.5 से शुरू, विकल्प ONLY_FULL_GROUP_BYडिफ़ॉल्ट रूप से सक्षम है।
इस प्रकार, standart SQL92 और पहले के अनुसार:

उन सूचियों की अनुमति नहीं देता है जिनके लिए चयनित सूची, HAVING स्थिति, या ORDER BY सूची गैर-पृथक स्तंभों का उल्लेख करती है, जिन्हें न तो GROUP BY खंड में नाम दिया गया है और न ही कार्यात्मक रूप से (BY द्वारा निर्धारित) GROUP BY कॉलम पर निर्भर हैं

( डॉक्स में अधिक पढ़ें )

इसलिए, उदाहरण के लिए:

SELECT * FROM `users` GROUP BY `name`;

उपरोक्त क्वेरी निष्पादित करने के बाद आपको त्रुटि संदेश मिलेगा।

# 1055 - चयनित सूची का अभिव्यक्ति # 1 समूह द्वारा खंड में नहीं है और इसमें गैर-अलग-अलग कॉलम 'testite.user.id' शामिल हैं, जो ग्रुप BY खंड में स्तंभों पर कार्यात्मक रूप से निर्भर नहीं है; यह sql_mode = only_full_group_by के साथ असंगत है

क्यों?
क्योंकि MySQL बिल्कुल समझ में नहीं आता है, समूहीकृत रिकॉर्ड्स से पुनर्प्राप्त करने के लिए क्या कुछ मान है, और यह बात है।

IE आपको अपनी usersतालिका में यह रिकॉर्ड बताने देता है :
यो

और आप ऊपर दिए गए अमान्य क्वेरी शो को निष्पादित करेंगे।
और आपको ऊपर दिखाया गया त्रुटि मिलेगी, क्योंकि, नाम के साथ 3 रिकॉर्ड है John, और यह अच्छा है, लेकिन, उन सभी में अलग-अलग emailफ़ील्ड मान हैं।
इसलिए, MySQL को यह समझ में नहीं आता है कि उनमें से कौन सा परिणामी रिकॉर्डेड रिकॉर्ड है।

आप इस तरह से अपनी क्वेरी को बदलकर, इस समस्या को ठीक कर सकते हैं:

SELECT `name` FROM `users` GROUP BY `name`

इसके अलावा, आप सेलेक्ट सेक्शन में और फील्ड जोड़ना चाह सकते हैं, लेकिन आप ऐसा नहीं कर सकते हैं, अगर वे एग्रीगेटेड नहीं हैं, लेकिन ऐसी बैसाखी है जिसका आप इस्तेमाल कर सकते हैं (लेकिन अत्यधिक रसीद नहीं):

SELECT ANY_VALUE(`id`), ANY_VALUE(`email`), `name` FROM `users` GROUP BY `name`

यहां छवि विवरण दर्ज करें

अब, आप पूछ सकते हैं कि ANY_VALUEअत्यधिक उपयोग की सिफारिश क्यों नहीं की जाती है?
क्योंकि MySQL को यह पता नहीं है कि समूहीकृत रिकॉर्ड्स का क्या मान है, और इस फ़ंक्शन का उपयोग करके, आप इसे उनमें से किसी को लाने के लिए कह रहे हैं (इस मामले में, नाम = जॉन के साथ पहले रिकॉर्ड का ईमेल मिला था)।
वास्तव में, मैं इस बारे में कोई विचार नहीं कर सकता कि आप इस व्यवहार को क्यों रखना चाहते हैं।

कृपया, यदि आप मुझे नहीं समझते हैं, तो MySQL में समूह बनाना कैसे काम करता है, इसके बारे में अधिक पढ़ें, यह बहुत सरल है।

और अंत तक, यहाँ एक और सरल, अभी तक मान्य क्वेरी है।
यदि आप उपलब्ध युगों के अनुसार कुल उपयोगकर्ताओं की गणना करना चाहते हैं, तो आप इस क्वेरी को लिख सकते हैं

SELECT `age`, COUNT(`age`) FROM `users` GROUP BY `age`;

जो MySQL के नियमों के अनुसार पूरी तरह से मान्य है।
और इसी तरह।

यह समझना महत्वपूर्ण है कि वास्तव में समस्या क्या है और इसके बाद ही समाधान लिखें।


इस अच्छे उत्तर के लिए धन्यवाद। क्या होगा यदि मैं परिणाम समूह में एक सरणी के रूप में, ईमेल भी चाहता हूं?
जोसिया

1
आप हमेशा हर प्रविष्टि प्राप्त करने के लिए आवश्यक फ़ील्ड GROUP_CONCAT कर सकते हैं।
अब्राहम तुगलोव

ओह! तो एक रास्ता है! कृपया इस प्रश्न में
योशिय्याह

इस बेहतरीन जवाब के लिए धन्यवाद। अगर मैं करना चाहता हूं तो क्या होगा GROUP BY DAY(created_date)? अगर DAY()यह जोड़ा जाता है तो यह काम नहीं करता है।
एसकेमो

41

मैं लारवेल 5.3, mysql 5.7.12 का उपयोग कर रहा हूं, लार्वा होमस्टीड पर (0.5.0, मेरा मानना ​​है)

/etc/mysql/my.cnfप्रतिबिंबित करने के लिए संपादन को स्पष्ट रूप से सेट करने के बाद भी :

[mysqld]
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

मैं अभी भी त्रुटि प्राप्त कर रहा था।

मैं बदलना पड़ा config/database.phpसे trueकरने के लिए false:

    'mysql' => [
        'strict' => false, //behave like 5.6
        //'strict' => true //behave like 5.7
    ], 

आगे की पढाई:

https://laracasts.com/discuss/channels/servers/set-set-sql-mode-on-homestead https://mattstauffer.co/blog/strict-mode-and-other-mysql-customizations-in-laravel -5-2


डांग! जो लारवेल यूजर्स के लिए मददगार था। उसके लिए +1।
Okafor T Kosiso

20

यदि आप wamp का उपयोग कर रहे हैं 3.0.6 या स्थिर 2.5 के अलावा किसी भी ऊपरी संस्करण को आप इस मुद्दे का सामना कर सकते हैं, सबसे पहले यह मुद्दा sql के साथ है। आपको अपने अनुसार खेतों का नाम देना होगा। लेकिन एक और तरीका है जिसके द्वारा आप इसे हल कर सकते हैं। नम के हरे आइकन पर क्लिक करें। mysql-> mysql सेटिंग्स-> sql_mode-> कोई नहीं। या कंसोल से आप डिफ़ॉल्ट मान बदल सकते हैं।

mysql> set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
mysql> set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

शानदार, भवन निर्माण पर उन्होंने कहा, show variables like '%sql_mode%';mysql कमांड लाइन में कमांड डालें , sql_mode सेटिंग उजागर होगी
जेड हान

19

फ़ाइल में लाइनों का जोड़ (नीचे उल्लेख): /etc/mysql/my.cnf

[mysqld]
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

मेरे लिए ठीक काम करो। सर्वर संस्करण: 5.7.18-0ubuntu0.16.04.1 - (उबंटू)


1
क्या आप आरडीएस का उपयोग कर रहे हैं?
मुबाशिर पावले

@ मुबाशिरपॉले नंबर
जगदीप सिंह

16

Mysql या phpmyadmin पर जाएं और डेटाबेस का चयन करें और फिर इस क्वेरी को निष्पादित करें और यह काम करेगा। मेरे लिए यह ठीक है।

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

महान..धन्य :)
मोहितेशिन 217

मेरी खुशी :) @mohit
अनिल गुप्ता

मुझे एक टन समय बचा, धन्यवाद।
जोयड़

1
आपका स्वागत है भाई @TharinduEranga
अनिल गुप्ता

1
लेकिन समाधान के साथ समस्या हर बार जब मैं अपने आप को पुनः आरंभ करता हूं तो मुझे क्वेरी को फिर से निष्पादित करने की आवश्यकता होती है। इसका मतलब है कि समाधान स्थायी या स्थायी नहीं है।
मुश्फिकुर रहमान

10

मैक के लिए:

1. डिफ़ॉल्ट my-default.cnf को /etc/my.cnf पर कॉपी करें

sudo cp $(brew --prefix mysql)/support-files/my-default.cnf /etc/my.cnf

2. अपने पसंदीदा संपादक का उपयोग करके my.cnf में sql_mode बदलें और इसे इस पर सेट करें

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

3. MySQL सर्वर को शुरू करें।

mysql.server restart

धन्यवाद, मेरे लिए भी काम किया। लेकिन मैं मैक के mysql डिफ़ॉल्ट का उपयोग करता हूं, इसलिए मेरे पास काढ़ा रास्ता नहीं है। बस sudo cp my-default.cnf /etc/my.cnf
माइक गुयेन

2
@ माइक गुयेन सूदो cp /usr/local/mysql-5.7.17-macos10.12-x86_64/support-files/my-default.cnf /etc/myc.nf sudo vi /etc/my.cnf सेट sql_model sql_mode = STRICT_ ।
योंग गाओ

7

इससे मुझे पूरे मुद्दे को समझने में मदद मिली:

  1. https://stackoverflow.com/a/20074634/1066234
  2. https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html

और एक समस्याग्रस्त क्वेरी के दूसरे उदाहरण में।

समस्याग्रस्त:

SELECT COUNT(*) as attempts, SUM(elapsed) as elapsedtotal, userid, timestamp, questionid, answerid, SUM(correct) as correct, elapsed, ipaddress FROM `gameplay`
                        WHERE timestamp >= DATE_SUB(NOW(), INTERVAL 1 DAY)
                        AND cookieid = #

इसे अंत तक जोड़कर हल किया गया:

  GROUP BY timestamp, userid, cookieid, questionid, answerid, elapsed, ipaddress

नोट: PHP में त्रुटि संदेश देखें, यह बताता है कि समस्या कहाँ है।

उदाहरण:

MySQL क्वेरी त्रुटि 1140: GROUP BY के बिना समेकित क्वेरी में, चयन सूची के # 4 अभिव्यक्ति में अवर्गीकृत कॉलम 'db.gameplay.timestamp' शामिल है; यह sql_mode = only_full_group_by - Query: SELECT COUNT (*) के रूप में असंगत, SUM (बीता हुआ) elapsedtotal, userid, timestamp, questionid, answerid, SUM (सही) के रूप में असंगत, सही, लम्बा, ipaddress से है। (अब) (, इंटरवल 1 दिन) और उपयोगकर्ता = 1

इस स्थिति में, समूह बीवाई में अभिव्यक्ति # 4 गायब थी।


1
उनका कहना है के लिए धन्यवाद stackoverflow.com/questions/20074562/...
cwhsu

इस मुद्दे को हल करने के लिए शानदार जवाब। बहुत बहुत धन्यवाद
हंसा एथुकोरला

7

लोकलहोस्ट / वैंपसर 3 के लिए हम इस त्रुटि को दूर करने के लिए sql-mode = user_mode सेट कर सकते हैं:

click on wamp icon -> MySql -> MySql Setting -> sql-mode -> user_mode

फिर नम या एपाचे को पुनरारंभ करें


1
मुझे पता है कि यह इस समस्या के लिए दीर्घकालिक समाधान नहीं हो सकता है, लेकिन यह निश्चित रूप से अभी के लिए मदद करता है। मेरी होस्टिंग कंपनी, गो डैडी, MySQL V5.6.33 और WampServer 3 MySQL V5.7.14 का उपयोग कर रहे हैं। इस त्वरित समाधान के लिए धन्यवाद
एलन एन

4

आप एक जोड़ सकते हैं unique indexकरने के लिए group_id; यदि आप सुनिश्चित हैं कि group_idअद्वितीय है।

यह क्वेरी को संशोधित किए बिना आपके मामले को हल कर सकता है

एक देर से जवाब, लेकिन यह जवाब में अभी तक उल्लेख नहीं किया गया है। हो सकता है कि यह पहले से उपलब्ध व्यापक उत्तरों को पूरा करे। कम से कम इसने मेरे मामले को हल किया जब मुझे बहुत सारे क्षेत्रों के साथ एक तालिका को विभाजित करना पड़ा।


2

यदि आप सिद्धांत क्वेरी बिल्डर का उपयोग करते हुए सिम्फनी के साथ यह त्रुटि करते हैं , और यदि यह त्रुटि एक आदेश के कारण होती है :

selectउस स्तंभ पर ध्यान दें जिसे आप चाहते हैं groupBy, और addGroupByइसके बजाय उपयोग करें groupBy:

$query = $this->createQueryBuilder('smth')->addGroupBy('smth.mycolumn');

सिम्फनी 3 पर काम करता है -


1

आपके सटीक SQL का उपयोग नहीं करने के लिए क्षमा याचना

मैंने इस प्रश्न का उपयोग मैसकल चेतावनी को दूर करने के लिए किया।

SELECT count(*) AS cnt, `regions_id`
FROM regionables 
WHERE `regionable_id` = '115' OR `regionable_id` = '714'
GROUP BY `regions_id`
HAVING cnt > 1

मेरे होने की कुंजी नोट करें

count(*) AS cnt
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.