Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Truy xuất bản ghi khớp với mảng giá trị phân cách dấu phẩy bằng FIND_IN_SET trong MySQL

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_SET tì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)