2011-04-05 24 views
26

के अंतिम अलग सेट जाओ मैं निम्नलिखित कॉलम युक्त एक डेटाबेस तालिका है:रिकॉर्ड

id code value datetime timestamp 

इस तालिका में केवल अनन्य मानों आईडी अर्थात प्राथमिक कुंजी में रहते हैं।

मैं डेटाटाइम मान के आधार पर इस तालिका में रिकॉर्ड के अंतिम विशिष्ट सेट को पुनर्प्राप्त करना चाहता हूं। उदाहरण के लिए, नीचे दिए गए मान लीजिए मेरी मेज

id code value datetime    timestamp 
1 1023 23.56 2011-04-05 14:54:52 1234223421 
2 1024 23.56 2011-04-05 14:55:52 1234223423 
3 1025 23.56 2011-04-05 14:56:52 1234223424 
4 1023 23.56 2011-04-05 14:57:52 1234223425 
5 1025 23.56 2011-04-05 14:58:52 1234223426 
6 1025 23.56 2011-04-05 14:59:52 1234223427 
7 1024 23.56 2011-04-05 15:00:12 1234223428 
8 1026 23.56 2011-04-05 15:01:14 1234223429 
9 1025 23.56 2011-04-05 15:02:22 1234223430 

मैं आईडी 4, 7, 8 के साथ रिकॉर्ड प्राप्त करना चाहते हैं, और 9 अर्थात विशिष्ट कोड (datetime मान पर आधारित) के साथ रिकॉर्ड के अंतिम सेट है। जो मैंने हाइलाइट किया है वह केवल एक उदाहरण है जिसे मैं हासिल करने की कोशिश कर रहा हूं, क्योंकि इस तालिका में अंततः लाखों रिकॉर्ड और सैकड़ों व्यक्तिगत कोड मान शामिल होंगे।

यह प्राप्त करने के लिए मैं किस SQL ​​कथन का उपयोग कर सकता हूं? मुझे ऐसा लगता है कि यह एक एकल SQL कथन के साथ नहीं किया जा सकता है। मेरा डेटाबेस MySQL 5.

उत्तर

50

यह आपके लिए काम करना चाहिए।

SELECT * 
FROM [tableName] 
WHERE id IN (SELECT MAX(id) FROM [tableName] GROUP BY code) 

तो आईडी AUTO_INCREMENT है, वहाँ, datetime जो कहीं अधिक गणना करने के लिए महंगा है के बारे में चिंता के रूप में हाल ही में दिनांक भी उच्चतम आईडी होगा आवश्यकता नहीं है।

अद्यतन: एक प्रदर्शन दृष्टिकोण से, यह सुनिश्चित करें id और code कॉलम इंडेक्स किए गए जब रिकॉर्ड की एक बड़ी संख्या के साथ काम कर सकते हैं। यदि id प्राथमिक कुंजी है, तो यह बनाया गया है, लेकिन आपको code और id को कवर करने वाले गैर-क्लस्टर्ड इंडेक्स को जोड़ने की आवश्यकता हो सकती है।

+1

+1 ऑटोटाइक्चर के समय डेटाटाइम परीक्षण से बचने के लिए +1 ... मैंने जवाब को दोबारा सुधारने की स्वतंत्रता ली। – krtek

+0

एक आकर्षण की तरह काम करता है! इसके लिए बहुत - बहुत धन्यवाद। –

+1

@smdrager, बहुत अच्छा ... मेरा समय बचाया। – vissu

0

मैं कुछ इस तरह की कोशिश करेंगे:

select * from table 
where id in (
    select id 
    from table 
    group by code 
    having datetime = max(datetime) 
) 

(अस्वीकरण: इस परीक्षण नहीं किया गया है)

बड़ा datetime साथ पंक्ति भी बड़ा आईडी है, तो समाधान smdrager द्वारा प्रस्तावित है तेज।

5

इस प्रयास करें:

SELECT * 
    FROM <YOUR_TABLE> 
WHERE (code, datetime, timestamp) IN 
(
    SELECT code, MAX(datetime), MAX(timestamp) 
    FROM <YOUR_TABLE> 
    GROUP BY code 
) 
+0

चूंकि तालिका में प्राथमिक कुंजी है, इसलिए आपको ऐसा जटिल जहां क्लॉज करना है। मेरा जवाब देखें – krtek

+0

@ क्रेटेक: सहमत है, लेकिन इसके लिए आईडी को ऑटो वृद्धि होने की धारणा की आवश्यकता है। – Chandu

+0

बिलकुल नहीं, smdrager उत्तर करता है, मेरा उपरोक्त 'आईडी' खंड – krtek

1

यह और पुराने पोस्ट, लेकिन बड़े तालिकाओं के साथ @smdrager जवाब का परीक्षण बहुत धीमी थी। इसका मेरा फिक्स "जहां इन" के बजाय "आंतरिक जुड़ने" का उपयोग कर रहा था।

SELECT * 
FROM [tableName] as t1 
INNER JOIN (SELECT MAX(id) as id FROM [tableName] GROUP BY code) as t2 
ON t1.id = t2.id 

यह वास्तव में तेज़ काम करता था।

+0

धन्यवाद के कारण उपयोग करने के लिए अच्छी आईडी देता है। जब मैं इसे उपयोग करने की आवश्यकता होगी तो मैं इसे आज़मा दूंगा। –

संबंधित मुद्दे