Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

ดึงแถวที่สองจากท้าย (Second Last Row) ใน MySQL

ใช้ ORDER BY ... DESC LIMIT 1, 1 เพื่อข้ามแถวสุดท้าย 1 แถว แล้วเอา 1 แถว

ไวยากรณ์

SELECT * FROM yourTableName ORDER BY yourColumnName DESC LIMIT 1, 1;

สร้างตารางตัวอย่าง

mysql> CREATE TABLE secondLastDemo (
    -> StudentId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> StudentName VARCHAR(10)
    -> );

เพิ่มข้อมูลตัวอย่าง (11 แถว)

mysql> INSERT INTO secondLastDemo(StudentName) VALUES
('Larry'), ('Carol'), ('Bob'), ('Sam'), ('Mike'), ('David'),
('Maxwell'), ('Robert'), ('James'), ('Chris'), ('Ramit');

แสดงข้อมูลทั้งหมด

mysql> SELECT * FROM secondLastDemo;

ผลลัพธ์:

+-----------+-------------+
| StudentId | StudentName |
+-----------+-------------+
| 1         | Larry       |
| 2         | Carol       |
| 3         | Bob         |
| 4         | Sam         |
| 5         | Mike        |
| 6         | David       |
| 7         | Maxwell     |
| 8         | Robert      |
| 9         | James       |
| 10        | Chris       |
| 11        | Ramit       |
+-----------+-------------+

ดึงแถวที่สองจากท้าย (Chris, Id=10)

mysql> SELECT * FROM secondLastDemo ORDER BY StudentId DESC LIMIT 1, 1;

ผลลัพธ์:

+-----------+-------------+
| StudentId | StudentName |
+-----------+-------------+
| 10        | Chris       |
+-----------+-------------+

อธิบาย LIMIT offset, count

  • LIMIT 1, 1 = ข้าม 1 แถว (offset=1) แล้วเอา 1 แถว (count=1)
  • LIMIT 0, 1 = แถวแรก (เหมือน LIMIT 1)
  • LIMIT 2, 1 = แถวที่ 3 จากท้าย

วิธีอื่น (MySQL 8.0+)

-- ใช้ ROW_NUMBER()
WITH ranked AS (
    SELECT *, ROW_NUMBER() OVER (ORDER BY StudentId DESC) AS rn
    FROM secondLastDemo
)
SELECT * FROM ranked WHERE rn = 2;

กรณีใช้งาน

  • ดูออเดอร์ก่อนหน้าล่าสุด
  • เปรียบเทียบค่าล่าสุดกับค่าก่อนหน้า
  • Audit trail: ดูการเปลี่ยนแปลงล่าสุด 2 ครั้ง