เมื่อเก็บข้อมูลหลายค่าในคอลัมน์เดียวแบบคั่นด้วยจุลภาค (comma-separated values) การค้นหาค่าเฉพาะในรายการนั้นๆ สามารถใช้ฟังก์ชัน FIND_IN_SET() ได้อย่างมีประสิทธิภาพ
สถานการณ์ตัวอย่าง
ตารางเก็บคะแนนสอบของนักเรียนหลายวิชาในคอลัมน์เดียว (Marks) คั่นด้วยจุลภาค
สร้างตารางและข้อมูล
mysql> create table DemoTable (
Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
Name varchar(20),
Marks varchar(200)
);
mysql> insert into DemoTable(Name,Marks) values('Larry','98,34,56,89');
mysql> insert into DemoTable(Name,Marks) values('Chris','67,87,92,99');
mysql> insert into DemoTable(Name,Marks) values('Robert','33,45,69,92');
ค้นหานักเรียนที่ได้คะแนน 99
mysql> select Id, Name from DemoTable where find_in_set('99', Marks) > 0;
ผลลัพธ์
+----+-------+ | Id | Name | +----+-------+ | 2 | Chris | +----+-------+
รูปแบบ FIND_IN_SET()
FIND_IN_SET(ค่าที่ต้องการค้นหา, คอลัมน์ที่เก็บรายการคั่นจุลภาค)
- คืนค่า ตำแหน่ง (1-based index) หากพบ
- คืนค่า 0 หากไม่พบหรือคอลัมน์เป็น NULL
- ไม่ใช้ index ได้ → ช้ากว่าการ normalize ตาราง
ข้อควรระวังและทางเลือกที่ดีกว่า
- ไม่แนะนำ สำหรับระบบ production ที่ต้องการประสิทธิภาพสูง
- ควรปรับโครงสร้างเป็นตารางความสัมพันธ์ (Normalization): สร้างตาราง Marks แยกมี Foreign Key
- MySQL 8.0+ รองรับ JSON data type และฟังก์ชัน
JSON_CONTAINS()ซึ่งดีกว่าและยืดหยุ่นกว่า - หากต้องใช้ CSV อยู่แล้ว ให้เพิ่ม index บนคอลัมน์ ID และจำกัดจำนวนแถวใน WHERE