Để tìm kiếm bản ghi chứa một giá trị cụ thể trong chuỗi được phân cách bằng dấu phẩy, MySQL cung cấp hàm FIND_IN_SET().
Tạo bảng điểm thi
mysql> CREATE TABLE DemoTable (
-> Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> Name VARCHAR(20),
-> Marks VARCHAR(200)
-> );
Chèn dữ liệu (điểm lưu dưới dạng chuỗi CSV)
mysql> INSERT INTO DemoTable(Name, Marks) VALUES('Larry', '98,34,56,89');
mysql> INSERT INTO DemoTable(Name, Marks) VALUES('Chris', '67,87,92,99');
mysql> INSERT INTO DemoTable(Name, Marks) VALUES('Robert', '33,45,69,92');
Xem dữ liệu
mysql> SELECT * FROM DemoTable;
+----+--------+-------------+ | Id | Name | Marks | +----+--------+-------------+ | 1 | Larry | 98,34,56,89 | | 2 | Chris | 67,87,92,99 | | 3 | Robert | 33,45,69,92 | +----+--------+-------------+
Tìm sinh viên có điểm 99
mysql> SELECT Id, Name FROM DemoTable WHERE FIND_IN_SET('99', Marks) > 0;
+----+-------+ | Id | Name | +----+-------+ | 2 | Chris | +----+-------+
Giải thích FIND_IN_SET()
FIND_IN_SET(str, strlist)trả về vị trí (1-based) củastrtrong chuỗistrlistphân cách 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ỳ tham số nào là NULL
- Lưu ý: Chỉ hoạt động chính xác khi không có khoảng trắng sau dấu phẩy (ví dụ: '1,2,3' chứ không phải '1, 2, 3')
Cảnh báo về thiết kế database
Lưu trữ nhiều giá trị trong một cột (danh sách phân cách bởi dấu phẩy) vi phạm chuẩn hóa database (1NF). Cân nhắc tạo bảng riêng cho điểm thi với quan hệ 1-nhiều để truy vấn hiệu quả và toàn vẹn dữ liệu tốt hơn.