Tìm khoảng trống (gap) nhỏ nhất trong dãy số MySQL
Sử dụng LEFT JOIN tự tham chiếu (self-join) để tìm số thứ tự bị thiếu nhỏ nhất trong cột số.
Tạo bảng và dữ liệu mẫu
mysql> CREATE TABLE FindValue (SequenceNumber INT); mysql> INSERT INTO FindValue VALUES (109), (110), (111), (113), (114);
Dữ liệu: 109, 110, 111, 112 thiếu, 113, 114
Truy vấn tìm giá trị thiếu nhỏ nhất
mysql> SELECT tbl1.SequenceNumber + 1 AS ValueNotUsedInSequenceNumber
-> FROM FindValue AS tbl1
-> LEFT JOIN FindValue AS tbl2 ON tbl1.SequenceNumber + 1 = tbl2.SequenceNumber
-> WHERE tbl2.SequenceNumber IS NULL
-> ORDER BY tbl1.SequenceNumber LIMIT 1;
Kết quả
+------------------------------+ | ValueNotUsedInSequenceNumber | +------------------------------+ | 112 | +------------------------------+
Giải thích logic
tbl1: Bảng gốctbl2: Bảng gốc join với điều kiệntbl1.SequenceNumber + 1 = tbl2.SequenceNumber- Nếu
tbl2.SequenceNumber IS NULL→ không có số tiếp theo → tìm thấy gap ORDER BY ... LIMIT 1lấy gap nhỏ nhất
Cách khác (MySQL 8.0+ dùng Window Function)
SELECT MIN(SequenceNumber) + 1 AS MissingValue
FROM (
SELECT SequenceNumber,
LEAD(SequenceNumber) OVER (ORDER BY SequenceNumber) AS NextVal
FROM FindValue
) t
WHERE NextVal > SequenceNumber + 1;
Lưu ý
- Phù hợp cho dãy số không quá lớn
- Cần index trên cột SequenceNumber để tối ưu hiệu năng
- Nếu bảng rỗng hoặc không có gap, truy vấn trả về NULL