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

Tìm ID VARCHAR trong danh sách giá trị phân cách bằng dấu phẩy với FIND_IN_SET trong MySQL


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_SET khô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]'