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

Tìm giá trị nhỏ nhất chưa sử dụng trong bảng MySQL?

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ốc
  • tbl2: Bảng gốc join với điều kiện tbl1.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 1 lấ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