ปัญหา: คอลัมน์เก็บค่าแบบ Comma-Separated Values (CSV)
เช่น '4,5,6' ต้องการหาแถวที่มีตัวเลข 4 อยู่ในรายการ
วิธี: CONCAT + LIKE
SELECT * FROM yourTable
WHERE CONCAT(',', yourColumn, ',') LIKE '%,4,%';
ตัวอย่าง: ตาราง demo49
CREATE TABLE demo49 (
id VARCHAR(20),
first_name VARCHAR(20)
);
INSERT INTO demo49 VALUES
('4,5,6', 'Adam'),
('5,3,2', 'Mike'),
('3,4,9', 'Bob');
ข้อมูล
+-------+------------+ | id | first_name | +-------+------------+ | 4,5,6 | Adam | | 5,3,2 | Mike | | 3,4,9 | Bob | +-------+------------+
คำสั่งค้นหาตัวเลข 4
SELECT * FROM demo49
WHERE CONCAT(',', id, ',') LIKE '%,4,%';
ผลลัพธ์
+-------+------------+ | id | first_name | +-------+------------+ | 4,5,6 | Adam | | 3,4,9 | Bob | +-------+------------+
ทำไมต้อง CONCAT ','?
ป้องกัน false positive:
- ค้นหา '4' แบบตรง:
'34,5,6'จะ match (ผิด) - ค้นหา ',4,':
',34,5,6,'ไม่ match (ถูกต้อง)
วิธีที่ดีกว่า: FIND_IN_SET() (MySQL Built-in)
SELECT * FROM demo49
WHERE FIND_IN_SET('4', id) > 0;
- จัดการ CSV ได้โดยตรง ไม่ต้อง CONCAT
- เร็วกว่า LIKE (มี optimization ภายใน)
- คืนค่าตำแหน่ง (1-based) หรือ 0 ถ้าไม่พบ
ข้อจำกัดของ FIND_IN_SET
- ทำงานกับ VARCHAR/TEXT เท่านั้น
- ค่าต้องคั่นด้วย comma (,) เท่านั้น — ไม่รองรับ delimiter อื่น
- ไม่ใช้ INDEX ได้ (full table scan)
- ค่าใน CSV ต้องไม่มี space:
'4, 5, 6'จะไม่ match '4'
แนวทางแก้ไขรากฐาน (Normalization)
แทนที่จะเก็บ CSV ใน 1 คอลัมน์ ให้สร้างตารางความสัมพันธ์:
CREATE TABLE user_interests (
user_id INT,
interest_id INT,
PRIMARY KEY (user_id, interest_id)
);
จะ Query, Index, Join ได้มีประสิทธิภาพมากกว่า