चयनित सूची ग्रुप द्वारा क्लाज में नहीं है और इसमें अवर्गीकृत कॉलम है ... sql_mode = only_full_group_by के साथ असंगत है


115

WPC सर्वर के साथ मेरी विंडोज़ पीसी पर MySQL 5.7.13 का उपयोग कर रहा हूँ

यहाँ मेरी समस्या इस क्वेरी को निष्पादित करते समय है

SELECT *
FROM `tbl_customer_pod_uploads`
WHERE `load_id` = '78' AND
      `status` = 'Active'
GROUP BY `proof_type`

हमेशा इस तरह त्रुटि हो रही है

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

क्या आप मुझे सबसे अच्छा समाधान बता सकते हैं ...

मुझे जैसे रिजल्ट चाहिए

+----+---------+---------+---------+----------+-----------+------------+---------------+--------------+------------+--------+---------------------+---------------------+
| id | user_id | load_id | bill_id | latitude | langitude | proof_type | document_type | file_name    | is_private | status | createdon           | updatedon           |
+----+---------+---------+---------+----------+-----------+------------+---------------+--------------+------------+--------+---------------------+---------------------+
|  1 |       1 | 78      | 1       | 21.1212  | 21.5454   |          1 |             1 | id_Card.docx |          0 | Active | 2017-01-27 11:30:11 | 2017-01-27 11:30:14 |
+----+---------+---------+---------+----------+-----------+------------+---------------+--------------+------------+--------+---------------------+---------------------+

12
उपयोग न करें SELECT *
shmosel


कह रहे हैं कि इस तरह का SELECT FROM tbl_customer_pod_uploadsWHERE load_id= '78' और status= 'एक्टिव' ग्रुप BYproof_type
धानु के

2
यदि आप पुराने प्रश्नों के लिए अनुकूलता चाहते हैं, तो आप only_full_group_bySQL मोड को बंद कर सकते हैं ।
बमर

4
ANY_VALUE (proof_type) का उपयोग कर प्रयास करें: dev.mysql.com/doc/refman/5.7/en/group-by-handling.html चुनें *, ANY_VALUE (proof_type) से tbl_customer_pod_uploadsकहां load_id= '78' और status= 'सक्रिय' ग्रुप द्वाराproof_type
AlexGach

जवाबों:


228

यह

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

बस इस कमांड द्वारा MySQL में sql मोड को बदलकर हल किया जाएगा,

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

यह मेरे लिए भी काम करता है .. मैंने इसका उपयोग किया, क्योंकि मेरी परियोजना में इस तरह की कई क्वेरी हैं इसलिए मैंने इस sql मोड को केवल____समूह_बदल दिया

धन्यवाद... :-)


14
इससे मेरा काम बनता है!। तुम मेरा दिन बचाओ।
रेस्टार्ट

2
अगर मैं कोडाइनिटर का उपयोग कर रहा हूं और मैं मॉडल में निष्पादित करना चाहता हूं, तो मैं इसका उपयोग कैसे करूंगा? मेरी मदद कर सकते हैं ? @marcode_ely
धवल थाकोर

@DhavalThakor, इस क्वेरी को एक बार अपने सर्वर में चलाने के बाद, आपको बार-बार चलाने की आवश्यकता नहीं है। इसलिए आपको इसे अपने मॉडल में रखने की आवश्यकता नहीं है
धनु के

2
MySQL 5.7.29, को सेवा को पुनः आरंभ करने की आवश्यकता नहीं थी
तावी

मैं सर्वर संस्करण का उपयोग कर रहा हूं: 5.7.31-0ubuntu0.16.04.1 - (उबंटू), और जब भी मैं अपनी मशीन शुरू करता हूं, मैं इसे हर बार सेट करता हूं, क्या इसके लिए कोई स्थायी निर्धारण है?
अर्पिता हुनका

71

जब MySQL का only_full_group_byमोड चालू होता है, तो इसका मतलब है कि उपयोग करते समय सख्त ANSI SQL नियम लागू होंगे GROUP BY। आपकी क्वेरी के संबंध में, इसका मतलब है कि आप उस GROUP BYके proof_typeस्तंभ, तो आप केवल दो चीजें चुन सकते हैं:

  • proof_typeस्तंभ, या
  • किसी अन्य स्तंभ के समुच्चय


अन्य स्तंभों के "समुच्चय" से मेरा मतलब है कि एक समुच्चय फ़ंक्शन का उपयोग करना MIN(), जैसे कि MAX(), या AVG()किसी अन्य स्तंभ के साथ। तो आपके मामले में निम्नलिखित प्रश्न मान्य होगा:

SELECT proof_type,
       MAX(id) AS max_id,
       MAX(some_col),
       MIN(some_other_col)
FROM tbl_customer_pod_uploads
WHERE load_id = '78' AND
      status = 'Active'
GROUP BY proof_type

MySQL का विशाल बहुमत GROUP BY के प्रश्न जो मुझे SO पर दिखाई देते हैं, उनमें सख्त मोड बंद है, इसलिए क्वेरी चल रही है, लेकिन गलत परिणामों के साथ। आपके मामले में, क्वेरी बिल्कुल भी नहीं चलेगी, जो आपको सोचने पर मजबूर करेगी कि आप वास्तव में क्या करना चाहते हैं।

नोट: ANSI SQL उस GROUP BYकॉलम को शामिल करने की अनुमति देता है जिसे स्तंभों में शामिल किया गया है, जो कार्यात्मक रूप से चयनित स्तंभ (कॉलम) पर निर्भर हैं । कार्यात्मक निर्भरता का एक उदाहरण एक तालिका में एक प्राथमिक कुंजी कॉलम द्वारा समूहीकृत किया जाएगा। चूंकि प्राथमिक कुंजी हर रिकॉर्ड के लिए अद्वितीय होने की गारंटी है, इसलिए किसी अन्य कॉलम का मूल्य भी निर्धारित किया जाएगा। MySQL उन डेटाबेसों में से एक है जो इसके लिए अनुमति देता है (SQL Server और Oracle AFAIK नहीं)।


2
बस एक नोट: परिणाम गलत नहीं है (यह MySQL नियमों का पालन करता है), लेकिन यह अप्रत्याशित है, अर्थ, कॉलम समूह का हिस्सा नहीं है और समग्र नहीं (और कार्यात्मक रूप से निर्भर नहीं है) संबंधित समूह से एक 'यादृच्छिक' मान लौटाएगा। मैनुअल राज्यों के रूप में: "सर्वर प्रत्येक समूह से किसी भी मूल्य चुनने के लिए स्वतंत्र है"
Pred

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

1
मेरे लिए +1। मुझे नहीं पता कि ऊपर दिए गए "स्वीकृत" उत्तर को क्यों स्वीकार किया गया है। आपका तरीका सही तरीका है और स्वीकृत उत्तर सामान्य हैकी फिक्स है जो भविष्य में और अधिक मुद्दों को जन्म देगा।
जेकोव

1
@ जेकोव ... और मैं आपकी टिप्पणी से अधिक +1 से सहमत नहीं हो सका। ANSI प्रतिबंध को बंद करना GROUP BYलगभग हमेशा एक बुरा विचार है। यह मुझे डराता है कि इतने सारे उपयोगकर्ता गलत सलाह ले रहे हैं और इसका उपयोग कर रहे हैं।
टिम बेगेलिएसेन

1
@TimBiegeleisen आधुनिक कॉपी + पेस्ट विकास में आपका स्वागत है। "मुझे सोचने की ज़रूरत नहीं है, किसी ने एक अविश्वसनीय स्रोत से कहीं एक यादृच्छिक चीज़ पढ़ी है जो पहले से ही मेरे लिए सोच है"।
जेकोव

38

किसी एक समाधान का उपयोग करें

(1) PHPMyAdmin

यदि आप phpMyAdmin का उपयोग कर रहे हैं तो नीचे दिए गए स्क्रीनशॉट में " sql_mode " सेटिंग को उल्लेखित रूप में बदल दें । यहां छवि विवरण दर्ज करें

"Sql मोड" वैरिएबल को एडिट करें और वैल्यू से "ONLY_FULL_GROUP_BY" टेक्स्ट को हटा दें

(2) SQL / कमांड प्रॉम्प्ट नीचे कमांड चलाएँ।

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

(3) ** का चयन न करें ***

सेलेक्ट क्वेरी में प्रासंगिक कॉलम का उपयोग करें। प्रासंगिक साधनों के कॉलम, जो या तो "समूह में" खंड या स्तंभ के साथ आ रहे हैं, जिसमें कुल फ़ंक्शन (MAX, MIN, SUM, COUNT आदि) हैं


महत्वपूर्ण लेख

बिंदु (1) या बिंदु (2) का उपयोग करके किए गए परिवर्तन इसे स्थायी रूप से सेट नहीं करेंगे, और यह प्रत्येक पुनरारंभ के बाद वापस आ जाएगा।

इसलिए आपको इसे अपनी कॉन्फिग फाइल (उदाहरण के लिए [mysqld] सेक्शन में /etc/mysql/my.cnf) में सेट करना चाहिए, ताकि MySQL रिस्टार्ट होने के बाद बदलाव प्रभावी रहे:

विन्यास फाइल : /etc/mysql/my.cnf

चर नाम : sql_mode या sql-mode


19

नीचे विधि मेरी समस्या हल:

Ubuntu में

प्रकार: sudo vi /etc/mysql/my.cnf

डालने का मोड दर्ज करने के लिए A टाइप करें

दो पंक्ति कोड के नीचे अंतिम पंक्ति पेस्ट में:

[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

इनपुट मोड से बाहर निकलने के लिए esc टाइप करें

Type :wq to save and close vim.

sudo service mysql restartMySQL को रिस्टार्ट करने के लिए टाइप करें।


1
धन्यवाद, यह काम किया! प्रतिशत में os, whm, my.cnf sudo vi /etc/my.cnf पर स्थित था
Reejesh PK

17

आप sql_mode = only_full_group_by को कुछ कमांड द्वारा अक्षम कर सकते हैं जिसे आप टर्मिनल या MySlive IDE द्वारा आज़मा सकते हैं

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';

9

SQL92 में कानूनी होने के लिए क्वेरी के लिए, नाम स्तंभ को चयन सूची से हटा दिया जाना चाहिए या समूह द्वारा नाम दिया जाना चाहिए।

SQL99 और बाद में इस तरह के नॉनग्रिगेट्स को वैकल्पिक सुविधा T301 पर अनुमति देता है यदि वे कार्यात्मक रूप से GROUP BY कॉलम पर निर्भर हैं: यदि ऐसा संबंध नाम और कस्टिड के बीच मौजूद है, तो क्वेरी कानूनी है। यह मामला होगा, उदाहरण के लिए, ग्राहकों की एक प्राथमिक कुंजी हिरासत में थे।

MySQL 5.7.5 और कार्यात्मक निर्भरता का पता लगाने के कार्यान्वयन। यदि ONLY_FULL_GROUP_BY SQL मोड सक्षम किया गया है (जो कि डिफ़ॉल्ट रूप से है), MySQL उन प्रश्नों को अस्वीकार करता है जिनके लिए चयन सूची, HAVING स्थिति, या ORDER BY सूची गैर-अलग-थलग स्तंभों का उल्लेख करती है, जिन्हें न तो ग्रुप द्वारा नाम दिया गया है, न ही खंड द्वारा और न ही कार्यात्मक रूप से उन पर निर्भर हैं। ।

MySQL के माध्यम से :: MySQL 5.7 संदर्भ मैनुअल :: ग्रुप के द्वारा 12.19.3 MySQL हैंडलिंग

आप इस कमांड के साथ sql मोड को बदलकर हल कर सकते हैं:

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

और ... डेटाबेस को फिर से जोड़ना याद रखें !!!


9

उबंटू में

चरण 1:

sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf

चरण 2: अंतिम पंक्ति पर जाएं और निम्नलिखित जोड़ें

sql_mode = ""

चरण 3: सहेजें

चरण 4: mysql सर्वर को पुनरारंभ करें।


5

phpmyadmin पर जाएं और कंसोल खोलें और इस अनुरोध को निष्पादित करें

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

3

"SQL मोड" के लिए खोजें यदि आप PhpMyAdmin का उपयोग कर रहे हैं और मान को हटा दें: ONLY_FULL_GROUP_BYबस, और यह ठीक है।


2

यह कैसे दिखता है, मुझे लगता है कि कई कॉलम / फ़ील्ड द्वारा समूहित करने से आपका परिणाम प्रभावित नहीं होगा। आप इस तरह से समूह में जोड़ने का प्रयास क्यों नहीं करते हैं:

GROUP BY `proof_type`, `id`

यह proof_typeतब तक समूह बना देगा id। मुझे उम्मीद है कि यह परिणामों में बदलाव नहीं करेगा। कई कॉलम द्वारा कुछ / अधिकांश मामलों में समूह गलत परिणाम देता है।


2
> sudo nano /etc/mysql/my.cnf

नीचे दर्ज करें

[mysqld]
sql_mode = ""

Ctrl + O => Y = Ctrl + X

> sudo service mysql restart

2

हाय सभी कॉलम लेने के बजाय, बस वही लें जो आपको चाहिए ANY_VALUE(column_name) । यह पूरी तरह से काम कर रहा है। जाँच करो।

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

SELECT proof_type,any_value("customer_name") as customer_name
FROM `tbl_customer_pod_uploads`
WHERE `load_id` = '78' AND `status` = 'Active' GROUP BY `proof_type`

1
  1. PhpMyAdmin पर लॉगिन करें
  2. पर नेविगेट करें: सर्वर: लोकलहोस्ट: 3306 और किसी भी डेटाबेस का चयन न करें
  3. शीर्ष मेनू से चर पर क्लिक करें
  4. "Sql मोड" के लिए खोजें और इसी मान को संपादित करें: NO_ENGINE_SUBSTITUTION

बस इतना ही।

मैंने अपने Ec2 में ऐसा किया और यह आकर्षण की तरह काम किया।


1

यह स्थायी रूप से स्थापित करने का एक बहुत तेज़ और आसान तरीका है

NB: चल रहा SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')); है अस्थायी है और सर्वर पुनरारंभ पर आप अभी भी त्रुटि के साथ समाप्त हो जाएगा। इसे ठीक करने के लिए नीचे स्थायी रूप से करें

  1. अपने सर्वर पर रूट के रूप में लॉगिन करें
  2. अपने टर्मिनल रन में wget https://gist.githubusercontent.com/nfourtythree/90fb8ef5eeafdf478f522720314c60bd/raw/disable-strict-mode.sh
  3. स्क्रिप्ट को चलाकर निष्पादन योग्य बनाएं chmod +x disable-strict-mode.sh
  4. स्क्रिप्ट को चलाकर चलाएं ./disable-strict-mode.sh

और आपके किए गए, mysql में परिवर्तन किए जाएंगे और इसे फिर से शुरू किया जाएगा


0

MySQL 8.0 के लिए अपडेट करें

आपका sql-modeनहीं होगा NO_AUTO_CREATE_USERके रूप में यह यहाँ उल्लेख निकाल दिया गया है - कैसे करने के लिए सेट एसक्यूएल मोड में मेरी-cnf-इन-mysql-8

[mysqld]
sql-mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"

इसके अलावा अगर किसी के पास कोई my.cnfफाइल नहीं है तो वे एक नया निर्माण करते हैं /etc/my.cnfऔर फिर उपरोक्त लाइनें जोड़ते हैं।


-2

अपने में my.ini, यह लिखें:

[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"

अपने संस्करण पर निर्भर करें। या:

[mysqld]
sql_mode = ""

या बस इसे हटा दें: ONLY_FULL_GROUP_BY


-2

आपको WAMP पैनल खोलें और MySQL कॉन्फ़िगरेशन फ़ाइल खोलें। यदि आप इसे "sql_mode" के लिए खोज करते हैं, तो यदि आप इसे "" और यदि आप नहीं पाते हैं तो इसे फ़ाइल में sql_mode = "" जोड़ें।

MySQL सर्वर को पुनरारंभ करें और आप जाने के लिए अच्छे हैं ...

खुश कोडिंग।

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