เมื่อต้องการดึงระเบียนที่ตรงกับเงื่อนไขวันที่ (เช่น วันนี้) แต่มีข้อมูลซ้ำหลายแถว และต้องการแสดงเพียง 1 แถว ใช้ LIMIT 1 ท้ายคำสั่ง SELECT
ตัวอย่างการใช้งาน
สมมติวันนี้คือ 2019-10-02
สร้างตารางวันที่ครบกำหนด:
mysql> CREATE TABLE DemoTable1450 (DueDate DATE);
เพิ่มข้อมูล (มี 2019-10-02 ซ้ำ 3 ครั้ง):
mysql> INSERT INTO DemoTable1450 VALUES ('2019-09-30'), ('2019-10-02'), ('2019-10-02'), ('2019-10-02');
ดูข้อมูลทั้งหมด:
mysql> SELECT * FROM DemoTable1450; +------------+ | DueDate | +------------+ | 2019-09-30 | | 2019-10-02 | | 2019-10-02 | | 2019-10-02 | +------------+
ดึงเฉพาะ 1 แถวที่ตรงกับวันนี้:
mysql> SELECT * FROM DemoTable1450 WHERE DueDate = CURDATE() LIMIT 1;
ผลลัพธ์:
+------------+ | DueDate | +------------+ | 2019-10-02 | +------------+
วิธีทางเลือกอื่นๆ
| วิธี | คำสั่ง | คำอธิบาย |
|---|---|---|
| LIMIT 1 | WHERE DueDate = CURDATE() LIMIT 1 | ง่ายที่สุด ดึงแค่ 1 แถว |
| DISTINCT | SELECT DISTINCT DueDate FROM DemoTable1450 WHERE DueDate = CURDATE() | ลบค่าซ้ำ แสดงค่า Unique |
| GROUP BY | SELECT DueDate FROM DemoTable1450 WHERE DueDate = CURDATE() GROUP BY DueDate | จัดกลุ่มค่าที่เหมือนกัน |
| ANY_VALUE() | SELECT ANY_VALUE(*) FROM DemoTable1450 WHERE DueDate = CURDATE() | MySQL 8.0+ ดึงค่าใดก็ได้จากกลุ่ม |
คำแนะนำ
- LIMIT 1 เร็วที่สุด (หยุดค้นหาเมื่อเจอแถวแรก) - เหมาะสำหรับเช็ค "มีหรือไม่"
- DISTINCT/GROUP BY ต้องอ่านทุกแถวที่ Match - ใช้เมื่อต้องการค่า Unique จริงๆ
- หากต้องการแถว "ล่าสุด" ให้เพิ่ม
ORDER BY Id DESCก่อน LIMIT 1 - ควรมี Index บนคอลัมน์ DueDate เพื่อประสิทธิภาพ
กรณีที่ซับซ้อนกว่า: ดึง 1 แถวต่อกลุ่ม (Per Group)
-- MySQL 8.0+ ใช้ ROW_NUMBER()
WITH Ranked AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY DueDate ORDER BY Id) AS rn
FROM DemoTable1450
)
SELECT * FROM Ranked WHERE rn = 1;