Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Hiển thị bản ghi ngày trùng lặp chỉ một lần trong MySQL với LIMIT

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 1 chỉ 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, 10 bỏ 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ậtCú phápMục đích
DISTINCTSELECT DISTINCT DueDate FROM ...Loại hàng trùng hoàn toàn (tất cả cột SELECT)
GROUP BYSELECT DueDate FROM ... GROUP BY DueDateGom 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 = 1MySQL 8.0+: Lấy 1 hàng mỗi nhóm theo thứ tự
Unique IndexALTER 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.