Khi một cột lưu nhiều giá trị phân cách bằng dấu phẩy (CSV), hàm FIND_IN_SET() trong MySQL cho phép kiểm tra xem một giá trị cụ thể có tồn tại trong danh sách đó hay không. Hàm này trả về vị trí (bắt đầu từ 1) nếu tìm thấy, hoặc 0 nếu không tìm thấy.
Ví dụ minh họa
Tạo bảng mã quốc gia:
mysql> CREATE TABLE DemoTable1439 (
CountryId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
CountryCode VARCHAR(20)
);
Chèn dữ liệu (CSV):
mysql> INSERT INTO DemoTable1439 (CountryCode) VALUES ('1022_US,7894_UK');
mysql> INSERT INTO DemoTable1439 (CountryCode) VALUES ('6567_AUS,7894_UK');
mysql> INSERT INTO DemoTable1439 (CountryCode) VALUES ('6567_AUS');
Dữ liệu:
mysql> SELECT * FROM DemoTable1439;
+-----------+------------------+ | CountryId | CountryCode | +-----------+------------------+ | 1 | 1022_US,7894_UK | | 2 | 6567_AUS,7894_UK | | 3 | 6567_AUS | +-----------+------------------+
Tìm hàng chứa '6567_AUS'
mysql> SELECT * FROM DemoTable1439
WHERE FIND_IN_SET('6567_AUS', CountryCode) > 0;
Kết quả (hàng 2 và 3):
+-----------+------------------+ | CountryId | CountryCode | +-----------+------------------+ | 2 | 6567_AUS,7894_UK | | 3 | 6567_AUS | +-----------+------------------+
Giải thích FIND_IN_SET
- Cú pháp:
FIND_IN_SET(str, strlist) - strlist: Chuỗi các giá trị phân cách bằng dấu phẩy không có khoảng trắng (VD: 'a,b,c' — không phải 'a, b, c').
- Trả về: Vị trí (1-based) nếu tìm thấy,
0nếu không tìm thấy,NULLnếu bất kỳ tham số nào là NULL. - Phân biệt chữ hoa/thường: Không (case-insensitive) theo collation mặc định.
So sánh với các phương pháp khác
| Phương pháp | Ưu điểm | Nhược điểm |
|---|---|---|
FIND_IN_SET() | Đúng ngữ nghĩa CSV, xử lý ranh giới phần tử | Không dùng index, chậm trên bảng lớn |
col LIKE '%,val,%' | Đơn giản | Sai với giá trị đầu/cuối, cần nhiều điều kiện |
JSON_CONTAINS() (MySQL 5.7+) | Dùng index trên JSON, chuẩn hơn | Yêu cầu cột kiểu JSON |
| Bảng liên kết (Normalization) | Chuẩn hóa, hiệu năng tốt, toàn vẹn dữ liệu | Phức tạp hơn khi thiết kế |
Khuyến nghị: Tránh lưu CSV trong cột. Hãy thiết kế bảng trung gian (many-to-many) hoặc dùng kiểu JSON (MySQL 5.7+) để tận dụng index và truy vấn hiệu quả.