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

ค้นหาข้อมูลในรายการคั่นด้วยจุลภาคใน MySQL ด้วย FIND_IN_SET()

เมื่อเก็บข้อมูลหลายค่าในคอลัมน์เดียวแบบคั่นด้วยจุลภาค (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