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

MySQL में सेलेक्ट करें जहाँ सभी पंक्तियाँ एक शर्त को पूरा करती हैं

@jjclarkson और @ davethegr8 के उत्तर करीब हैं, लेकिन आप WHERE क्लॉज में कुल फ़ंक्शन नहीं डाल सकते। प्रत्येक पंक्ति के लिए WHERE क्लॉज का मूल्यांकन किया जाता है।

आपको MAX() . का मूल्यांकन करना होगा प्रत्येक समूह के लिए अभिव्यक्ति, इसलिए आपको एक HAVING . का उपयोग करने की आवश्यकता है खंड।

इसे आजमाएं:

SELECT UserID 
FROM ArrivalTimes
GROUP BY UserID
HAVING MAX(ArrivalTime) <= '09:00:00';

@MBCook टिप्पणी करता है कि HAVING धीमा हो सकता है। आप सही कह रहे हैं, यह वांछित परिणाम उत्पन्न करने का सबसे तेज़ तरीका नहीं हो सकता है। लेकिन HAVING समाधान सबसे स्पष्ट है . ऐसी स्थितियां हैं जहां स्पष्टता और रखरखाव की तुलना में प्रदर्शन की प्राथमिकता कम होती है।

मैंने HAVING . के लिए EXPLAIN आउटपुट (MySQL 5.1.30 पर) को देखा समाधान:कोई अनुक्रमणिका का उपयोग नहीं किया गया था, और अतिरिक्त नोट्स ने कहा "Using temporary; Using filesort ," जिसका आमतौर पर मतलब है कि प्रदर्शन खराब होगा।

निम्नलिखित प्रश्न पर विचार करें:

SELECT DISTINCT a1.UserID
FROM ArrivalTimes a1
  LEFT OUTER JOIN ArrivalTimes a2 
  ON (a1.UserID = a2.UserID AND a2.ArrivalTime > '09:00:00')
WHERE a2.UserID IS NULL;

यह एक अनुकूलन योजना तैयार करता है जो UserID . पर एक अनुक्रमणिका का उपयोग करता है और कहता है:

  • a1:"Using index; Using temporary "
  • a2:"Using where; Distinct "

अंत में, निम्न क्वेरी एक अनुकूलन योजना उत्पन्न करती है जो अनुक्रमणिका का सबसे प्रभावी ढंग से उपयोग करती प्रतीत होती है, और कोई अस्थायी तालिका या फ़ाइलसॉर्ट नहीं।

SELECT DISTINCT a1.UserID
FROM ArrivalTimes a1
WHERE NOT EXISTS (SELECT * FROM ArrivalTimes a2 
                  WHERE a1.UserID = a2.UserID 
                    AND a2.ArrivalTime > '09:00:00'); 
  • a1:"Using where; Using index "
  • a2:"Using where "

यह सबसे अच्छा प्रदर्शन होने की सबसे अधिक संभावना है। बेशक, मेरी परीक्षण तालिका में केवल चार पंक्तियाँ हैं, इसलिए यह एक प्रतिनिधि परीक्षण नहीं है।



  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. macOS पर mysql इंस्टॉल करें

  3. AVG का उपयोग करके MySQL क्वेरी में समस्या ()

  4. बाइनरी फ़ाइल सामग्री php print_r में दिखाई गई है लेकिन mysql में सहेजी नहीं गई है

  5. Mysql पुनरावर्ती संग्रहीत कार्यविधि...सीमा 0 पर पहुंच गया...max_sp_recursion_depth चर नहीं बदल सकता