Vấn đề
Cột lưu danh sách ID dạng chuỗi: '10,100,1000'. Cần tìm dòng chứa ID cụ thể (ví dụ '2') trong danh sách đó.
Giải pháp: FIND_IN_SET()
FIND_IN_SET(str, strlist) trả về vị trí (1-based) của str trong chuỗi strlist phân cách bằng dấu phẩy. Trả về 0 nếu không tìm thấy.
Ví dụ minh họa
Tạo bảng và chèn dữ liệu
mysql> CREATE TABLE DemoTable (
Id VARCHAR(255)
);
mysql> INSERT INTO DemoTable VALUES
('10,100,1000'), ('101,120,2'), ('3,4,5');
Truy vấn tìm ID '2'
mysql> SELECT * FROM DemoTable WHERE FIND_IN_SET('2', Id);
Kết quả
+-----------+ | Id | +-----------+ | 101,120,2 | +-----------+
Lưu ý quan trọng
- Phân cách PHẢI là dấu phẩy (,) không có khoảng trắng. '1, 2, 3' không hoạt động.
FIND_IN_SETkhông dùng index → chậm trên bảng lớn.- Chỉ hoạt động chính xác với chuỗi không chứa dấu phẩy trong phần tử.
Cải tiến: Chuẩn hóa dữ liệu
Thiết kế tốt hơn: Tách bảng quan hệ (many-to-many).
CREATE TABLE items (id INT PRIMARY KEY, name VARCHAR(100)); CREATE TABLE item_tags (item_id INT, tag_id INT, PRIMARY KEY(item_id, tag_id));
Xử lý phân cách khác (chấm phẩy ;, pipe |...)
-- Thay ; thành , rồi dùng FIND_IN_SET
WHERE FIND_IN_SET('2', REPLACE(Id, ';', ','))
MySQL 8.0: JSON_CONTAINS (nếu lưu JSON array)
WHERE JSON_CONTAINS(tags, '2', '$') -- tags = '[10, 100, 1000]'