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

Cách chọn các dòng cụ thể trong MySQL với FIND_IN_SET()?

Tình huống

Khi dữ liệu lưu dưới dạng chuỗi phân cách bằng dấu phẩy (CSV) trong một cột, cần tìm các dòng chứa giá trị cụ thể.

Giải pháp: FIND_IN_SET()

Hàm FIND_IN_SET(str, strlist) trả về vị trí của chuỗi str trong danh sách 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 (
    ListOfValues VARCHAR(200)
);

mysql> INSERT INTO DemoTable VALUES('112,114,567,Java,345');
mysql> INSERT INTO DemoTable VALUES('222,214,256');
mysql> INSERT INTO DemoTable VALUES('2,567,98,C');

Dữ liệu gốc

+----------------------+
| ListOfValues         |
+----------------------+
| 112,114,567,Java,345 |
| 222,214,256          |
| 2,567,98,C           |
+----------------------+

Truy vấn tìm dòng chứa giá trị '2'

mysql> SELECT * FROM DemoTable 
    -> WHERE FIND_IN_SET('2', ListOfValues) > 0;

Kết quả

+--------------+
| ListOfValues |
+--------------+
| 2,567,98,C   |
+--------------+

Lưu ý quan trọng

  • Không có dấu cách sau dấu phẩy: '1,2,3' đúng, '1, 2, 3' sai
  • Phân biệt chữ hoa/thường: FIND_IN_SET('java', 'Java') trả về 0
  • Hiệu năng: Không sử dụng index, chậm trên bảng lớn

Thiết kế tốt hơn

Thay vì lưu CSV, hãy chuẩn hóa cơ sở dữ liệu:

CREATE TABLE Items (
    Id INT PRIMARY KEY,
    ListId INT,
    Value VARCHAR(50),
    FOREIGN KEY (ListId) REFERENCES Lists(Id)
);

Sau đó dùng JOIN thông thường - nhanh hơn, đúng chuẩn quan hệ.