เลือกแถวสุดท้ายใน MySQL


182

ฉันจะSELECTแถวสุดท้ายในตาราง MySQL ได้อย่างไร

ฉันกำลังINSERTส่งข้อมูลและฉันจำเป็นต้องดึงค่าคอลัมน์จากแถวก่อนหน้า

มีauto_incrementในตาราง


8
กำหนด "แถวสุดท้าย" คนที่มี ID สูงที่สุด? หรือเพิ่มเข้ามาล่าสุด?
EboMike

1
สิ่งที่ระบุแถวสุดท้าย - มีคอลัมน์ auto_increment หรือ DATETIME ในตารางหรือไม่
OMG Ponies

ใช่มีauto_incrementอยู่ในนั้น ฉันต้องการที่เพิ่มเข้ามาล่าสุด
เลี่ยง

9
ไม่มีแถวสุดท้ายในชุดดังที่ EboMike และ OMG Ponies กล่าว คุณจะทำอย่างไรถ้าฉันให้ถุงที่เต็มไปด้วยลูกบอลและขอให้คุณให้ลูกสุดท้ายกับฉัน
Vincent Savard

คำตอบ:


402

ใช่มี auto_increment อยู่ในนั้น

หากคุณต้องการสุดท้ายของแถวทั้งหมดในตารางจากนั้นในที่สุดก็ถึงเวลาที่MAX(id)คำตอบที่ถูกต้อง! ชนิด:

SELECT fields FROM table ORDER BY id DESC LIMIT 1;

12
ฉันกลัวว่ามันจะช้าถ้าจำเป็นต้องเรียงแถวเป็นล้านแถวใช่ไหม?
ลาวา

2
ฉันวิ่งไปแถวนี้มากกว่า 20 ม. และมันเร็วมาก ฉันสมมติว่ามีกรณีพิเศษบางประเภทสำหรับจัดการคิวรีนี้ (แก้ไข: MySQL 5.7, เครื่องมือ InnoDB)
Daniel Buckmaster

1
@Pekka: ฉันไม่ต้องการใช้คำสั่งซื้อโดยมีตัวเลือกอื่น ๆ ที่จะทำหรือไม่
พระอิศวร

4
@Slawa ถ้าไม่ได้idจัดทำดัชนี
มาร์ควิสแห่ง Lorne

31

โปรดทราบว่าตารางในฐานข้อมูลเชิงสัมพันธ์เป็นเพียงชุดของแถว และเซตในวิชาคณิตศาสตร์เป็นคอลเล็กชั่นที่ไม่ได้เรียงลำดับ ไม่มีแถวแรกหรือแถวสุดท้าย ไม่มีแถวก่อนหน้าหรือแถวถัดไป

คุณจะต้องเรียงลำดับแถวที่ไม่เรียงลำดับของคุณตามบางฟิลด์ก่อนจากนั้นคุณจะทำซ้ำได้อย่างอิสระผ่านชุดผลลัพธ์ตามลำดับที่คุณกำหนด

เนื่องจากคุณมีฟิลด์การเพิ่มโดยอัตโนมัติฉันถือว่าคุณต้องการให้เป็นฟิลด์การเรียงลำดับ ในกรณีนั้นคุณอาจต้องการทำสิ่งต่อไปนี้:

SELECT    *
FROM      your_table
ORDER BY  your_auto_increment_field DESC
LIMIT     1;

ดูว่าเราเรียงลำดับชุดแถวที่ไม่เรียงลำดับแรกอย่างไรตามลำดับyour_auto_increment_field(หรือสิ่งที่คุณเรียก) ในลำดับถัดลงมา จากนั้นเราจะ จำกัด resultset LIMIT 1ไปเพียงแถวแรกด้วย


25

คุณสามารถรวมแบบสอบถามสองรายการที่แนะนำโดย @spacepille เป็นแบบสอบถามเดียวที่มีลักษณะดังนี้:

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

มันควรจะทำงานอย่างรวดเร็ว แต่ในตาราง INNODB นั้นเศษเสี้ยวของ milisecond ช้ากว่า ORDER + LIMIT


@karthikeyan เขียนคำตอบของเขาเมื่อสี่วันก่อนและฉันตอบคำถามนี้ในเดือนธันวาคม 2558
vzr

ไม่ฉันแก้ไขและแก้ไขการสะกดคำ 4 วันที่ผ่านมา ... วันที่โพสต์คือ 2014 answered Jun 14 at 9:41นั่นประมาณ 1 ปีและ 6 เดือนก่อนหน้านี้ :)
Dwza

เพื่อล้างอากาศที่นี่ vzr ถูกต้อง '14 มิ.ย. ' หมายถึง 14 มิ.ย. 2016 และ @karthikeyan เป็นสมาชิกของสองเดือนเท่านั้นในตอนนี้
Robert Brisita

Ssooo ... @ karthikeyan คำตอบคือสำเนาของอันนี้!
Cliff Burton

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 หากคุณต้องการไปตาม ID ให้เรียงลำดับตาม ID mysql_insert_idหากคุณต้องการที่จะใช้อย่างใดอย่างหนึ่งที่คุณเพิ่มเพียงใช้


4

เกือบทุกตารางฐานข้อมูลมีคอลัมน์ auto_increment (โดยทั่วไปคือ id)

หากคุณต้องการสุดท้ายของแถวทั้งหมดในตาราง

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 แถวจะส่งคืนแถวสุดท้ายโดยไม่ต้องพึ่งพา primary_key

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.