Khi một cột lưu trữ danh sách số cách nhau bằng dấu phẩy (ví dụ: '245,345,678,90'), hàm FIND_IN_SET() của MySQL là công cụ phù hợp để kiểm tra xem một số cụ thể có nằm trong danh sách đó hay không.
Tạo bảng và chèn dữ liệu
mysql> CREATE TABLE DemoTable (
CustomerId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
CustomerName VARCHAR(20),
CustomerAllProductPrice TEXT
);
mysql> INSERT INTO DemoTable (CustomerName, CustomerAllProductPrice) VALUES
('Chris', '245,345,678,90,45,56,78'),
('Chris', '98,99,90,56,77'),
('David', '1000,2000,4000,56000');
Xem dữ liệu
mysql> SELECT * FROM DemoTable;
+------------+--------------+-------------------------+
| CustomerId | CustomerName | CustomerAllProductPrice |
+------------+--------------+-------------------------+
| 1 | Chris | 245,345,678,90,45,56,78 |
| 2 | Chris | 98,99,90,56,77 |
| 3 | David | 1000,2000,4000,56000 |
+------------+--------------+-------------------------+
Tìm hàng chứa số 4000
mysql> SELECT * FROM DemoTable
WHERE FIND_IN_SET('4000', CustomerAllProductPrice);
Kết quả
+------------+--------------+-------------------------+
| CustomerId | CustomerName | CustomerAllProductPrice |
+------------+--------------+-------------------------+
| 3 | David | 1000,2000,4000,56000 |
+------------+--------------+-------------------------+
Giải thích FIND_IN_SET(str, strlist)
- Trả về vị trí (1-based index) của
strtrong chuỗistrlist(danh sách cách nhau bằng dấu phẩy). - Trả về 0 nếu không tìm thấy hoặc
strlistlà chuỗi rỗng. - Trả về NULL nếu bất kỳ đối số nào là NULL.
- Không dùng được nếu
strlistchứa dấu phẩy bên trong giá trị (ví dụ:'1,000,2,000').
Lưu ý hiệu năng
FIND_IN_SET không sử dụng index, phải quét toàn bảng (full table scan). Với dữ liệu lớn, nên chuẩn hóa dữ liệu: tách thành bảng liên kết (many-to-many) hoặc dùng kiểu JSON (MySQL 5.7+) với JSON_CONTAINS.