2013-08-14 9 views
32

होने से मैं जब इस कोड को क्रियान्वित करने समस्या है:ग्रुप मैक्स तारीख

SELECT * FROM tblpm n 
WHERE date_updated=(SELECT MAX(date_updated) 
FROM tblpm GROUP BY control_number 
HAVING control_number=n.control_number) 

असल में, मैं प्रत्येक नियंत्रण नंबर के लिए सबसे हाल ही में तारीख लौटना चाहते। ऊपर दी गई क्वेरी सही आउटपुट लौटाती है लेकिन इसमें 37secs लगते हैं। आउटपुट दिखाए जाने से पहले।

क्या कोई अन्य एसक्यूएल क्लॉज या कमांड है जो उपर्युक्त क्वेरी से तेज़ी से निष्पादित कर सकता है?

अग्रिम धन्यवाद।

SELECT * FROM tblpm n 
WHERE date_updated=(SELECT MAX(date_updated) 
    FROM tblpm WHERE control_number=n.control_number) 

इसके अलावा, आप 'date_updated' कॉलम पर एक सूचकांक है है:

उत्तर

73

WHERE खंड में सबक्वायरी डालने और इसे n.control_number पर प्रतिबंधित करने का अर्थ है कि यह कई बार subquery चलाता है। इसे सहसंबंधित सबक्वायरी कहा जाता है, और यह अक्सर प्रदर्शन हत्यारा होता है।

अधिकतम नियंत्रण प्रति अधिकतम संख्या प्राप्त करने के लिए, FROM खंड में, बार-बार उपकुंजी चलाने के लिए बेहतर है।

SELECT n.* 
FROM tblpm n 
INNER JOIN (
    SELECT control_number, MAX(date_updated) AS date_updated 
    FROM tblpm GROUP BY control_number 
) AS max USING (control_number, date_updated); 
+0

धन्यवाद सर! यह अब पूरी तरह से काम करता है :-) –

+3

mysql दस्तावेज़ -> http://dev.mysql.com/doc/refman/5.0/en/example-maximum-column-group-row.html –

+0

@ पैकेट ट्रासर, दस्तावेज़ लिंक के लिए धन्यवाद ! और फिर भी, इस सवाल को स्टैक ओवरव्लो पर 900 गुना से अधिक बार पूछा गया है क्योंकि मैंने [टैग: सबसे बड़ा-एन-प्रति-समूह] टैग बनाया है। –

12

उस सबक्वेरी में समूह की कोई जरूरत नहीं है, जहां खंड पर्याप्त होगा एक है ...? यह निश्चित रूप से मदद करेगा।

+0

toooo ... अच्छा !!! जीवन बचतकर्ता :) –

+2

यदि अपडेट की गई तारीख समान है (टाई), तो यह समाधान का उपयोग करते समय दोनों रिकॉर्ड दिखाता है, इसलिए आपको 'GROUP BY n जोड़ना होगा। control_number' – radtek

-3

तीव्र और आसान होने के साथ:

SELECT * FROM tblpm n 
FROM tblpm GROUP BY control_number 
HAVING date_updated=MAX(date_updated); 

HAVING के संदर्भ में, MAX प्रत्येक समूह के अधिकतम पाता है। प्रत्येक समूह में केवल नवीनतम प्रविष्टि date_updated=max(date_updated) को संतुष्ट करेगी। यदि किसी समूह के भीतर नवीनतम के लिए कोई टाई है, तो दोनों HAVING फ़िल्टर पास करेंगे, लेकिन GROUP BY का अर्थ है कि लौटाई गई तालिका में केवल एक ही दिखाई देगा।

+0

वास्तव में मैं डर इस उम्मीद के रूप में, मैं एक खाली परिणाम इस प्रश्न के लिए सेट मिल काम नहीं करता: 'चयन * से order_order_status जहां order_order_status द्वारा order_order_status.order_id = 1 समूह। (, 1, 1 '2016/10/01 01:57:37') 'order_order_status में डालने (आईडी, ORDER_ID, created_at) मान ,: ORDER_ID होने order_order_status.created_at = अधिकतम (order_order_status.created_at)' तालिका उन प्रविष्टियां हैं (2, 2, '2016/10/01 01:57:54'), (3, 3, '2016/10/02 02:12:49'), (4, 3, '2016-10 -02 02:14:19 '), (5, 3,' 2016/10/02 04:18:07 '), (8, 1,' 2016/10/03 01:22:53 '); ' – Toskan

+0

काश मैं downvote सकता है, यह मेरे लिए कुछ समय – Toskan

+0

यह काम नहीं करता खो दिया! – Alexey

-1

एक और तरीका है कि द्वारा समूह का उपयोग नहीं करता:

SELECT * FROM tblpm n 
    WHERE date_updated=(SELECT date_updated FROM tblpm n 
         ORDER BY date_updated desc LIMIT 1) 
संबंधित मुद्दे