MySQL 5.7 से पहले डिफ़ॉल्ट गैर-पूर्ण group by
की अनुमति देना था . जिसका अर्थ है कि आपके पास एक समूह हो सकता है (जो sum
. जैसे समग्र कार्यों का उपयोग करता है) और max
और count
और group_concat
) अन्य गैर-एकत्रित स्तंभों के साथ (चलिए उन्हें NON AGGS
. कहते हैं) ) जैसे आपका पहला 3 दिखाया गया सभी नहीं आपके group by
खंड। इसने इसकी अनुमति दी लेकिन परिणाम आम तौर पर इस तरह काम करेंगे:
-
यह बहुत अच्छा काम करता है क्योंकि आप अपने डेटा को अच्छी तरह से जानते हैं और एक अलग हासिल करने की कोशिश कर रहे हैं
-
यह भयानक काम किया क्योंकि यह एक तड़क-भड़क वाला था
5.7 से पहले, ONLY_FULL_GROUP_BY
अस्तित्व में था लेकिन इसे डिफ़ॉल्ट रूप से बंद कर दिया गया था।
तो MySQL 5.7 में ONLY_FULL_GROUP_BY
आता है डिफॉल्ट ऑन। जैसे कि यदि आप समूह द्वारा प्रयास करते हैं, लेकिन सभी के साथ नहीं NON AGGS
group by
. में खंड, आपको एक त्रुटि मिलेगी।
नीचे दिए गए 5.6 में निम्नलिखित समस्या पर विचार करें:
create table thing
( col1 int not null,
col2 int not null,
age int not null
);
insert thing(col1,col2,age) values
(1,2,10),
(1,3,20),
(2,3,20),
(2,2,10);
select col1,col2,max(age) from thing group by col1;
+------+------+----------+
| col1 | col2 | max(age) |
+------+------+----------+
| 1 | 2 | 20 |
| 2 | 3 | 20 |
+------+------+----------+
ऊपर जो होता है वह सभी NON AGGS
नहीं है group by
. में हैं . यह col1 द्वारा अधिकतम (आयु) लौटाता है। लेकिन चूंकि col2
group by
में नहीं था , इसने क्लस्टर इंडेक्स या फिजिकल ऑर्डरिंग का इस्तेमाल किया और इसे अनजाने में (एक स्नफू, एक गलती), col2 के लिए गलत मान लाया। आपके इरादों या आपके डेटा को जानने या यहां तक कि देखभाल करने पर निर्भर करता है। इंजन परवाह नहीं था; शायद आप करते हैं।
इन सामान्य गलतियों या अनजाने में डेटा वापसी से बचने के लिए, MySQL 5.7 ONLY_FULL_GROUP_BY
चालू करता है डिफ़ॉल्ट रूप से।
आपके मामले में, संभवतः कॉलम 2 और 3 के लिए गलत पंक्तियाँ आपके परिणाम बना रही हैं।
MySQL Handling of GROUP BY<शीर्षक वाला मैनुअल पेज देखें। /ए> ।
उदाहरण 2
-- drop table if exists person;
create table person
( id int auto_increment primary key,
firstName varchar(100) not null,
lastName varchar(100) not null
);
-- drop table if exists fruitConsumed;
create table fruitConsumed
( id int auto_increment primary key,
theDate date not null,
fruitId int not null, -- does not really matter. Say, 1=apple, 2=orange from some other table
personId int not null,
qty int not null
);
-- truncate table person;
insert person (firstName,lastName) values
('Dirk','Peters'),
('Dirk','Smith'),
('Jane','Billings');
-- truncate table fruitConsumed;
insert fruitConsumed (theDate,fruitId,personId,qty) values
('2016-10-31',1,1,2),
('2016-10-31',2,1,5),
('2016-10-31',2,2,12),
('2016-11-02',2,2,3);
प्रश्न:
select p.firstName,p.lastName,sum(fc.qty)
from person p
join fruitConsumed fc
on fc.personId=p.id
group by p.firstName,p.lastName;
+-----------+----------+-------------+
| firstName | lastName | sum(fc.qty) |
+-----------+----------+-------------+
| Dirk | Peters | 7 |
| Dirk | Smith | 15 |
+-----------+----------+-------------+
ONLY_FULL_GROUP_BY
की सेटिंग पर ध्यान दिए बिना उपरोक्त MySQL 5.6 और 5.7 पर बढ़िया काम करता है
अब विचार करें
select p.firstName,p.lastName,sum(fc.qty)
from person p
join fruitConsumed fc
on fc.personId=p.id
group by p.firstName;
+-----------+----------+-------------+
| firstName | lastName | sum(fc.qty) |
+-----------+----------+-------------+
| Dirk | Peters | 22 |
+-----------+----------+-------------+
उपरोक्त अक्सर MySQL 5.6 पर ONLY_FULL_GROUP_BY
के बिना स्वीकार्य है सक्षम है और 5.7 को ONLY_FULL_GROUP_BY
. के साथ विफल हो जाता है सक्षम (त्रुटि 1055)। उपरोक्त आउटपुट मूल रूप से अस्पष्ट है। लेकिन नीचे इसे कुछ हद तक समझाया गया है:
हम जानते हैं कि डिर्क, एक डिर्क, केवल एक डिर्क, आंतरिक जुड़ाव से बचने वाला एकमात्र है। 2 डिर्क हैं। लेकिन group by p.firstName
. के कारण , हम सिर्फ एक डिर्क के साथ बचे हैं। हमें एक lastName
चाहिए . SQL मानक के अनुरूप नहीं होने के कारण, MySQL इसे ONLY_FULL_GROUP_BY
के साथ अनुमति दे सकता है कामोत्तेजित। तो यह किसी भी पुराने अंतिम नाम को चुनता है। ठीक है, सबसे पहले वह पाता है, और वह या तो कैश में है या भौतिक क्रम में है।
और यह पीटर्स के साथ चला गया। फलों की संख्या का योग सभी डिर्क के लिए है।
इसलिए यदि आप इस तरह कोड करते हैं, तो गैर-अनुरूप गैर-ONLY_FULL_GROUP_BY
आपको बकवास देता है।
और जैसा कि कहा गया है, MySQL 5.7 जहाजों ने इसकी अनुमति नहीं दी। लेकिन अगर आप चाहें तो इसे पुराने तरीके से बदला जा सकता है।
यह अत्यधिक अनुशंसा की जाती है कि आप अपने प्रश्नों को ठीक करें और ONLY_FULL_GROUP_BY
छोड़ दें सक्षम के रूप में।