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

क्या MySQL में केवल एक फ़ील्ड के लिए WHERE क्लॉज दिखाने का कोई तरीका है?

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 छोड़ दें सक्षम के रूप में।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. कोडनिर्देशक लेनदेन

  2. MySQL में दो तिथियों के बीच अंतर

  3. समर्पित सर्वर पर MySQL ट्यूनिंग की मूल बातें

  4. MySQL - क्वेरी की गति का परीक्षण करने के लिए कैश का उपयोग न करने के लिए बाध्य करें

  5. एक आदेश के साथ SQL समूह द्वारा