मैं एक पूरी पंक्ति का चयन कैसे करूं जिसमें तालिका में सबसे बड़ी आईडी है?


141

जवाबों:


228

आप एक सबसिलेक्ट का उपयोग कर सकते हैं:

SELECT row 
FROM table 
WHERE id=(
    SELECT max(id) FROM table
    )

ध्यान दें कि यदि मान max(id)विशिष्ट नहीं है, तो कई पंक्तियाँ वापस आ जाती हैं।

यदि आप केवल ऐसी ही एक पंक्ति चाहते हैं, तो @ MichaelMior के उत्तर का उपयोग करें,

SELECT row from table ORDER BY id DESC LIMIT 1

6
@AlirezaSoori: नाम के बावजूद, idएक तालिका में सिर्फ एक स्तंभ है। इस बात की कोई गारंटी नहीं है कि idकॉलम में मान अद्वितीय होने चाहिए।
अनटुब

1
@unutbu यह मानते हुए कि idएक प्राथमिक या अद्वितीय कुंजी नहीं है :) नाम को देखते हुए, यह एक उचित मौका है कि यह है। यह भी ध्यान देने योग्य है कि आपके द्वारा उपयोग किए जा रहे DBMS के आधार पर, सबसिलेक्ट के साथ दृष्टिकोण बहुत कम कुशल हो सकता है।
माइकल मिओर

3
@MichaelMior: idएक विदेशी कुंजी हो सकती है, जिस स्थिति में यह अद्वितीय नहीं हो सकती है। मैंने कुछ बेंचमार्किंग का उपयोग किया था set profiling = 1; ...; show profilesऔर ऐसा लगता है कि हमारे समाधान में MySQL का उपयोग करने वाला समान प्रदर्शन है। मेरे स्वयं के ज्ञान के लिए, क्या आप जानते हैं कि DBMS में सबसिलेक्टर्स के लिए खराब प्रदर्शन क्या है?
२०

1
यह एक विदेशी कुंजी हो सकती है, लेकिन जैसा कि मैंने कहा, मैं सिर्फ नाम के आधार पर अनुमान लगा रहा हूं कि यह नहीं है। MySQL ऐतिहासिक रूप से subselects के साथ खराब प्रदर्शन के लिए जाना जाता है। हालांकि, नए संस्करणों में बहुत सुधार हुआ है, इसलिए यह निर्भर करता है कि आप किस संस्करण का उपयोग कर रहे हैं। हालाँकि, इसे पुनर्विचार करते हुए, यह विशेष क्वेरी ठीक हो सकती है। हालाँकि प्रोफाइलिंग के साथ कुछ बार एक क्वेरी चलाना जरूरी नहीं कि सापेक्ष प्रदर्शन के बारे में बहुत कुछ कहता है।
माइकल मिओर

149

आप भी कर सकते हैं

SELECT row FROM table ORDER BY id DESC LIMIT 1;

यह अवरोही क्रम में उनकी ID द्वारा पंक्तियों को क्रमबद्ध करेगा और पहली पंक्ति लौटाएगा। यह अधिकतम आईडी के साथ पंक्ति को वापस करने के समान है। यह निश्चित रूप से मानता है कि idसभी पंक्तियों के बीच अद्वितीय है। अन्यथा अधिकतम मूल्य वाली कई पंक्तियाँ हो सकती हैं idऔर आपको केवल एक ही मिलेगा।


विशेष रूप से वह करने के लिए जो ओपी पूछ रहा है, मैं यह करूँगा। लेकिन अन्य उत्तर SQL संरचना पर एक बेहतर शिक्षा प्रदान करते हैं :)
MatBailie

@ लगता है कि कैसे? किसी अन्य उत्तर पर कोई स्पष्टीकरण नहीं दिया गया है? की मैं पाठ्यक्रम के रूप में अच्छी तरह से इस बात का दोषी हूँ :(
माइकल Mior

बस यह कि अन्य प्रश्न तर्क को ठीक किए बिना वाक्य रचना को सही करते हैं। तो, ओपी सीखता है कि उस विशिष्ट एसक्यूएल को सही तरीके से कैसे बताया जाए।
MatBailie

उचित बिंदु :) हालांकि अन्य उत्तर यकीनन अभी भी तर्क को सही कर रहे हैं।
बजे माइकल मिओर

प्रदर्शन के बारे में क्या? मैं इस तरह की क्वेरी के साथ यहां पहले से ही मेरे लिए काम कर रहा था, लेकिन मैं सोच रहा था कि क्या यह सही तरीका है। क्या O (n * log n) ऑपरेशन द्वारा ORDER नहीं है?
ढाई

27
SELECT * 
FROM table 
WHERE id = (SELECT MAX(id) FROM TABLE)

@ shA.t SELECT entry FROM table WHERE id = MAX(id)काम नहीं करेगा ?!
ओल्डबॉय

@ shA.t इसके अलावा, मैं निम्नलिखित के जैसा कुछ करने की कोशिश कर रहा हूं: SELECT entry_time FROM users_unverified WHERE num_id = (SELECT MAX(num_id) FROM users_unverified WHERE account_email = :account_email)जिससे मुझे entry_timeडेटाबेस में सबसे हाल की प्रविष्टि की आवश्यकता है। क्या यह कथन पर्याप्त है या यह होना चाहिए:SELECT entry_time FROM users_unverified WHERE num_id = (SELECT MAX(num_id) FROM users_unverified) AND account_email = :account_email
17

क्वेरी परिणाम में सबसे हाल की प्रविष्टि के लिए कोई विश्वसनीय अर्थ नहीं है, आपको प्रविष्टि समय आदि के लिए एक फ़ील्ड की आवश्यकता है। BTW, कृपया अपना प्रश्न अलग से पूछें, मुझे आशा है कि आप अधिक ध्यान देंगे -HTH;)।
shA.t

17

आप नहीं दे सकते order byक्योंकि order byएक मेज पर "पूर्ण स्कैन" करता है।

निम्नलिखित प्रश्न बेहतर है:

SELECT * FROM table WHERE id = (SELECT MAX(id) FROM table);

18
ORDER BYयदि आप मान लेते हैं कि idतालिका की प्राथमिक कुंजी है तो एक पूर्ण स्कैन नहीं करेगा । (और अगर यह नहीं है, तो यह खराब नाम है।) यदि यह नहीं है, तो आप MAX(id)पूर्ण टेबल स्कैन के बिना काम करने की उम्मीद कैसे करते हैं ? यदि कोई इंडेक्स नहीं है, तो अधिकतम खोजने के लिए हर मूल्य की जांच होनी चाहिए।
माइकल मेयोर

@CakeLikeBoss अच्छी तरह से मैंने वास्तव में "क्वेरी" और आपके "चयन से तालिका" का आदेश दिया है, जहां आईडी = (तालिका से अधिकतम (आईडी) का चयन करें); " 114 पंक्तियों की तालिका में क्वेरी करते हुए इस क्वेरी को हर बार ठीक 0.0004 सेकंड में लिया गया, जबकि दूसरी क्वेरी 0.0007 से 0.0010 सेकंड के लिए ली गई, मैंने इसे कई बार दोहराया
प्रभजोत

1

एक हमेशा विश्लेषणात्मक कार्यों के लिए जा सकता है जो आपको अधिक नियंत्रण देगा

select tmp.row from ( select row, rank() over(partition by id order by id desc ) as rnk from table) tmp where tmp.rnk=1

यदि आप डेटा के प्रकार के आधार पर रैंक () फ़ंक्शन के साथ समस्या का सामना करते हैं तो पंक्ति से चुन सकते हैं nnumber () या dense_rank () भी।


0

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

 SELECT top 1  id, Col2,  row_number() over (order by id desc)  FROM Table

9
TOP कीवर्ड MySQL में काम नहीं करता है। यह क्वेरी काम नहीं करेगी।
अनिरुद्ध गुप्ता

@toddmo: MySQL! और Sql- सर्वर भी अन्य लोगों के लिए उपयोगी नहीं है। आपका मतलब है MS-SQL?
रायल २३'१17

@raiserle, क्या आप मुझे इस सवाल पर कुछ भी बताने या पोस्ट करने में मदद कर सकते हैं? मैं कहीं भी इस सवाल से जुड़ा अपना नाम नहीं देख सकता।
मई को टोडरमो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.