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

การแสดงวันที่ซ้ำเพียงครั้งเดียวใน MySQL ด้วย LIMIT

เมื่อต้องการดึงระเบียนที่ตรงกับเงื่อนไขวันที่ (เช่น วันนี้) แต่มีข้อมูลซ้ำหลายแถว และต้องการแสดงเพียง 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 1WHERE DueDate = CURDATE() LIMIT 1ง่ายที่สุด ดึงแค่ 1 แถว
DISTINCTSELECT DISTINCT DueDate FROM DemoTable1450 WHERE DueDate = CURDATE()ลบค่าซ้ำ แสดงค่า Unique
GROUP BYSELECT 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;