Tìm kiếm trong cột chứa danh sách giá trị phân cách bằng dấu phẩy
Sử dụng hàm FIND_IN_SET() - chuyên dụng cho chuỗi CSV (Comma-Separated Values).
Tạo bảng và dữ liệu
mysql> create table DemoTable ( ListOfValue varchar(20) ); Query OK, 0 rows affected (0.52 sec)
mysql> insert into DemoTable values('78,89,65');
mysql> insert into DemoTable values('88,96,97');
mysql> insert into DemoTable values('95,96,99,100');
mysql> insert into DemoTable values('78,45,67,98');
Truy vấn tìm hàng chứa 89 HOẶC 99
mysql> select * from DemoTable
-> where find_in_set('89',ListOfValue)
-> or find_in_set('99',ListOfValue);
Kết quả
+--------------+ | ListOfValue | +--------------+ | 78,89,65 | | 95,96,99,100 | +--------------+
Giải thích FIND_IN_SET(str, csv_col):
- Trả về vị trí (1-based) của
strtrong chuỗicsv_col - Trả về 0 nếu không tìm thấy
- Trong WHERE, giá trị > 0 được coi là TRUE
⚠️ Hạn chế:
- Chỉ hoạt động đúng với chuỗi không chứa khoảng trắng sau dấu phẩy ('1,2,3' OK, '1, 2, 3' KHÔNG OK)
- Không tận dụng index → chậm trên bảng lớn
- Thiết kế tốt hơn: Chuẩn hóa dữ liệu (bảng riêng cho mối quan hệ nhiều-nhiều)
Thay thế hiện đại: MySQL 8.0+ hỗ trợ JSON: WHERE JSON_CONTAINS(cot_json, '89').