Giới thiệu
Sử dụng FIND_IN_SET() để lọc hàng có giá trị trong cột lưu danh sách phân cách bằng dấu phẩy (CSV).
1. Tạo bảng và dữ liệu
mysql> create table DemoTable1548 (
-> StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> StudentName varchar(20),
-> ArrayListOfMarks varchar(100)
-> );
Query OK, 0 rows affected (0.88 sec)
mysql> insert into DemoTable1548(StudentName,ArrayListOfMarks) values('Chris','56,78,90,87');
Query OK, 1 row affected (0.29 sec)
mysql> insert into DemoTable1548(StudentName,ArrayListOfMarks) values('Bob','90,78,65');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable1548(StudentName,ArrayListOfMarks) values('David','91,34,56,78,87');
Query OK, 1 row affected (0.16 sec)
2. Dữ liệu gốc
mysql> select * from DemoTable1548;
+-----------+-------------+------------------+ | StudentId | StudentName | ArrayListOfMarks | +-----------+-------------+------------------+ | 1 | Chris | 56,78,90,87 | | 2 | Bob | 90,78,65 | | 3 | David | 91,34,56,78,87 | +-----------+-------------+------------------+ 3 rows in set (0.00 sec)
3. Tìm học sinh có điểm 87
mysql> select * from DemoTable1548 where find_in_set('87', ArrayListOfMarks);
4. Kết quả
+-----------+-------------+------------------+ | StudentId | StudentName | ArrayListOfMarks | +-----------+-------------+------------------+ | 1 | Chris | 56,78,90,87 | | 3 | David | 91,34,56,78,87 | +-----------+-------------+------------------+ 2 rows in set (0.00 sec)
Lưu ý quan trọng:
FIND_IN_SETtìm khớp chính xác phần tử, không khớp một phần (ví dụ: '8' không khớp '87')- Không tận dụng index → full table scan
- Thiết kế chuẩn: Tách bảng điểm riêng (StudentId, Mark) để JOIN hiệu quả
Mở rộng: Tìm nhiều giá trị: WHERE FIND_IN_SET('87', Marks) AND FIND_IN_SET('90', Marks)