@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
"
यह सबसे अच्छा प्रदर्शन होने की सबसे अधिक संभावना है। बेशक, मेरी परीक्षण तालिका में केवल चार पंक्तियाँ हैं, इसलिए यह एक प्रतिनिधि परीक्षण नहीं है।