Khi truy vấn các bản ghi khớp với một ngày cụ thể (ví dụ: hôm nay) và có nhiều hàng trùng ngày đó, dùng LIMIT 1 để chỉ trả về một hàng đại diện. Điều này hữu ích khi chỉ cần kiểm tra sự tồn tại hoặc lấy mẫu.
Ví dụ minh họa
Ngày hiện tại giả định: 2019-10-02
Tạo bảng ngày đáo hạn:
mysql> CREATE TABLE DemoTable1450 (
DueDate DATE
);
Chèn dữ liệu (3 hàng trùng 2019-10-02):
mysql> INSERT INTO DemoTable1450 VALUES ('2019-09-30');
mysql> INSERT INTO DemoTable1450 VALUES ('2019-10-02');
mysql> INSERT INTO DemoTable1450 VALUES ('2019-10-02');
mysql> INSERT INTO DemoTable1450 VALUES ('2019-10-02');
Dữ liệu:
mysql> SELECT * FROM DemoTable1450;
+------------+ | DueDate | +------------+ | 2019-09-30 | | 2019-10-02 | | 2019-10-02 | | 2019-10-02 | +------------+
Chỉ lấy 1 hàng khớp ngày hôm nay
mysql> SELECT * FROM DemoTable1450
WHERE DueDate = CURDATE()
LIMIT 1;
Kết quả:
+------------+ | DueDate | +------------+ | 2019-10-02 | +------------+
Lưu ý quan trọng về LIMIT
LIMIT 1chỉ giới hạn số hàng trả về, không đảm bảo hàng nào được trả về nếu không cóORDER BY.- Kết hợp với
ORDER BYđể xác định:ORDER BY Id LIMIT 1(hàng đầu tiên),ORDER BY Id DESC LIMIT 1(hàng mới nhất). LIMIT offset, count:LIMIT 5, 10bỏ qua 5 hàng đầu, lấy 10 hàng tiếp.
Các kỹ thuật liên quan để loại trùng lặp
| Kỹ thuật | Cú pháp | Mục đích |
|---|---|---|
DISTINCT | SELECT DISTINCT DueDate FROM ... | Loại hàng trùng hoàn toàn (tất cả cột SELECT) |
GROUP BY | SELECT DueDate FROM ... GROUP BY DueDate | Gom nhóm, có thể dùng hàm tập hợp |
ROW_NUMBER() | SELECT * FROM (SELECT ..., ROW_NUMBER() OVER (PARTITION BY DueDate ORDER BY Id) rn FROM ...) t WHERE rn = 1 | MySQL 8.0+: Lấy 1 hàng mỗi nhóm theo thứ tự |
| Unique Index | ALTER TABLE t ADD UNIQUE KEY uk_due (DueDate) | Ngăn chặn trùng lặp ở mức DB |
Khi nào dùng LIMIT 1?
- Kiểm tra tồn tại:
EXISTS (SELECT 1 FROM t WHERE DueDate = CURDATE() LIMIT 1). - Lấy mẫu đại diện (sample).
- Pagination trang đầu:
LIMIT 10(10 hàng đầu). - Tránh trả về quá nhiều hàng gây chậm client/network.