Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

ค้นหาเรคคอร์ดที่มีตัวเลขเฉพาะในคอลัมน์ CSV ด้วย MySQL

ปัญหา: คอลัมน์เก็บค่าแบบ 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 ได้มีประสิทธิภาพมากกว่า