Giới thiệu
Hàm FIND_IN_SET(str, strlist) tìm chuỗi str trong danh sách chuỗi phân cách bằng dấu phẩy strlist. Trả về vị trí (bắt đầu từ 1) hoặc 0 nếu không tìm thấy.
1. Tạo bảng và dữ liệu
mysql> create table DemoTable (
-> Value varchar(20)
-> );
Query OK, 0 rows affected (0.47 sec)
mysql> insert into DemoTable values('41,14,94');
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable values('64,84,94');
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable values('44,74,103,104');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable values('904,1004,1444,1544');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable values('4,144,174');
Query OK, 1 row affected (0.15 sec)
2. Dữ liệu gốc
mysql> select *from DemoTable;
+--------------------+ | Value | +--------------------+ | 41,14,94 | | 64,84,94 | | 44,74,103,104 | | 904,1004,1444,1544 | | 4,144,174 | +--------------------+ 5 rows in set (0.00 sec)
3. Tìm hàng chứa giá trị '4' chính xác
mysql> select *from DemoTable where find_in_set('4', Value);
4. Kết quả
+-----------+ | Value | +-----------+ | 4,144,174 | +-----------+ 1 row in set (0.00 sec)
Tại sao không dùng LIKE?
LIKE '%4%'sẽ khớp 41, 14, 94, 44, 104, 1444, 1544, 4, 144, 174 → saiFIND_IN_SETso khớp chính xác từng phần tử phân cách bởi dấu phẩy
Lưu ý:
- Chỉ hoạt động đúng khi danh sách không chứa dấu phẩy trong phần tử
- Không sử 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 sang bảng riêng (many-to-many)