ใช้ 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 ครั้ง