MySQL में अंतिम पंक्ति का चयन करें


181

मैं SELECTएक MySQL तालिका में अंतिम पंक्ति कैसे कर सकता हूं ?

मैं INSERTआईएनजी डेटा हूं और मुझे पिछली पंक्ति से एक स्तंभ मान प्राप्त करने की आवश्यकता है।

वहाँ एक है auto_incrementतालिका में।


8
"अंतिम पंक्ति" को परिभाषित करें। उच्चतम आईडी के साथ एक? या सबसे हाल ही में एक जोड़ा?
ईबोमाइक

1
अंतिम पंक्ति क्या इंगित करती है - क्या तालिका में एक स्वत: सुधार या डेटा कॉलम है?
ओएमजी पोनीज

हाँ, वहाँ एक auto_incrementहै। मुझे सबसे हाल ही में जोड़ा गया एक चाहिए।
एस्क्यू

9
एक सेट में कोई अंतिम पंक्ति नहीं है, जैसा कि ईबोमाइक और ओएमजी पोंजी ने कहा। अगर मैं आपको गेंदों से भरा बैग देता और आपको आखिरी गेंद देने के लिए कहता, तो आप क्या करते?
विन्सेंट सवार्ड

जवाबों:


402

हाँ, वहाँ एक auto_increment है

यदि आप तालिका में सभी पंक्तियों में से अंतिम चाहते हैं , तो यह आखिरकार वह समय है जहां MAX(id)सही उत्तर है! एक प्रकार का:

SELECT fields FROM table ORDER BY id DESC LIMIT 1;

12
मुझे डर है कि अगर यह लाखों पंक्तियों को छाँटने की जरूरत है, तो यह धीमा नहीं है?
स्लाव

2
मैंने इसे केवल 20 मीटर से अधिक पंक्तियों में चलाया और यह बहुत तेज़ था। मुझे लगता है कि इस क्वेरी को संभालने के लिए किसी प्रकार का विशेष मामला है। (EDIT: MySQL 5.7, InnoDB इंजन)
डैनियल बकमास्टर

1
@Pekka: मैं आदेश का उपयोग नहीं करना चाहता, क्या इसे करने के लिए कोई अन्य विकल्प है?
शिव

4
@ शलावा यदि idअनुक्रमित नहीं है।
लोरेन

31

ध्यान रखें कि रिलेशनल डेटाबेस में टेबल सिर्फ पंक्तियों के सेट हैं। और गणित में सेट अनियोजित संग्रह हैं। कोई पहली या अंतिम पंक्ति नहीं है; कोई पिछली पंक्ति या अगली पंक्ति नहीं।

आपको पहले किसी न किसी क्षेत्र द्वारा अनियंत्रित पंक्तियों के अपने सेट को क्रमबद्ध करना होगा, और फिर आप परिभाषित किए गए क्रम में परिणाम के माध्यम से पुनरावृति से मुक्त होंगे।

चूंकि आपके पास एक ऑटो वेतन वृद्धि क्षेत्र है, इसलिए मुझे लगता है कि आप चाहते हैं कि छँटाई क्षेत्र हो। उस स्थिति में, आप निम्नलिखित कार्य करना चाहते हैं:

SELECT    *
FROM      your_table
ORDER BY  your_auto_increment_field DESC
LIMIT     1;

देखें कि हम सबसे पहले किस प्रकार your_auto_increment_fieldअवरोही पंक्तियों के सेट को (या जो कुछ भी आपने इसे बुलाया है) को अवरोही क्रम में क्रमबद्ध कर रहे हैं। फिर हम परिणाम को केवल पहली पंक्ति के साथ सीमित करते हैं LIMIT 1


25

आप @spacepille द्वारा सुझाए गए दो प्रश्नों को एक ही प्रश्न में जोड़ सकते हैं जो इस तरह दिखता है:

SELECT * FROM `table_name` WHERE id=(SELECT MAX(id) FROM `table_name`);

इसे तेजी से धधकते हुए काम करना चाहिए, लेकिन INNODB टेबलों पर यह ORDER + LIMIT की तुलना में मिलिसकॉन्ड स्लोअर का अंश है।


@karthikeyan ने चार दिन पहले अपना उत्तर लिखा था और मैंने इसका उत्तर दिसंबर 2015 में दिया था
vzr

नहींं, मुझे 4 दिन पहले कुछ वर्तनी संपादित और ठीक कर दी ... पोस्ट की तारीख 2014 answered Jun 14 at 9:41है 1 वर्ष और 6 महीने पहले के बारे में :)
द्विज

बस यहाँ हवा साफ़ करने के लिए vzr सही है। The जून 14 ’का मतलब जून 14, 2016 भी है @ इस समय तक केवल दो महीने के लिए @ कार्तिकेयन सदस्य थे।
रॉबर्ट ब्रिसिटा

Ssooo ... @ कार्तिकेयन का जवाब इस एक की एक प्रति है!
क्लिफ बर्टन

24

कई पंक्तियों वाली तालिकाओं पर दो प्रश्न संभवतः अधिक तेज़ हैं ...

SELECT @last_id := MAX(id) FROM table;

SELECT * FROM table WHERE id = @last_id;

6

इसे बस उपयोग करें: PDO::lastInsertId

http://php.net/manual/en/pdo.lastinsertid.php


2
सही। अधिकांश सभ्य MySQL इंटरफ़ेस पुस्तकालयों ने इसके लिए तरीकों को समर्पित किया है, हालांकि इस सवाल को PHP नहीं बल्कि सामान्य MySQL सिंटैक्स टैग किया गया था।
vzr

4

यदि आप हाल ही में जोड़े गए सबसे अधिक चाहते हैं, तो टाइमस्टैम्प जोड़ें और उच्चतम टाइमस्टैम्प द्वारा रिवर्स ऑर्डर में आदेश का चयन करें, सीमा 1. यदि आप आईडी से जाना चाहते हैं, तो आईडी द्वारा सॉर्ट करें। यदि आप अपने द्वारा जोड़े गए एक का उपयोग करना चाहते हैं, तो उपयोग करें mysql_insert_id


4

लगभग हर डेटाबेस तालिका में एक स्वत: संग्रहण कॉलम (आमतौर पर आईडी) होता है

यदि आप तालिका की सभी पंक्तियों में से अंतिम चाहते हैं,

SELECT columns FROM table ORDER BY id DESC LIMIT 1;

या

आप दो प्रश्नों को एक ही प्रश्न में जोड़ सकते हैं जो इस तरह दिखता है:

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

ऑटो वेतन वृद्धि केवल तभी है यदि DBA (या जिसने भी टेबल बनाई है) ने ऑटो वेतन वृद्धि लागू की
WhatsThePoint

2
SELECT * FROM adds where id=(select max(id) from adds);

यह क्वेरी आपकी तालिका में अंतिम रिकॉर्ड लाने के लिए उपयोग की जाती है।


नीचे दिए गए उत्तर की प्रति
Jbur43

2

यहाँ कई उत्तर वही कहते हैं (आपके ऑटो इंक्रीमेंट द्वारा ऑर्डर), जो ठीक है, बशर्ते आपके पास एक स्वत: संकलित कॉलम है जो अनुक्रमित है।

एक तरफ ध्यान दें, यदि आप ऐसे क्षेत्र है और यह है प्राथमिक कुंजी, वहाँ का उपयोग कर के लिए कोई प्रदर्शन की सजा है order byबनाम select max(id)। प्राथमिक कुंजी यह है कि डेटाबेस फ़ाइलों में डेटा का आदेश कैसे दिया जाता है (कम से कम InnoDB के लिए), और RDBMS को पता है कि डेटा कहाँ समाप्त होता है, और यह अनुकूलन कर सकता हैorder by id + limit 1 पहुंच के समान होने का कर सकता हैmax(id)

अब सड़क कम यात्रा तब होती है जब आपके पास एक प्राथमिक प्राथमिक कुंजी नहीं होती है। हो सकता है कि प्राथमिक कुंजी एक प्राकृतिक कुंजी है, जो 3 क्षेत्रों का एक संयोजन है ... सभी खो नहीं है, हालांकि। एक प्रोग्रामिंग भाषा से आप सबसे पहले पंक्तियों की संख्या प्राप्त कर सकते हैं

SELECT Count(*) - 1 AS rowcount FROM <yourTable>;

और फिर LIMITक्लॉज में प्राप्त संख्या का उपयोग करें

SELECT * FROM orderbook2
LIMIT <number_from_rowcount>, 1

दुर्भाग्य से, MySQL LIMITक्लाज में उप-क्वेरी या उपयोगकर्ता चर के लिए अनुमति नहीं देगा


1

आप OFFSETएक LIMITकमांड में उपयोग कर सकते हैं :

SELECT * FROM aTable LIMIT 1 OFFSET 99

यदि आपकी तालिका में 100 पंक्तियाँ हैं, तो यह प्राथमिक पंक्ति पर निर्भर किए बिना अंतिम पंक्ति को लौटाती है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.