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

MySQL: ดึงข้อมูลจากคอลัมน์ที่เก็บค่าคั่นด้วยจุลภาค (Comma-separated) ด้วย FIND_IN_SET()

ปัญหา

เมื่อคอลัมน์หนึ่งเก็บหลายค่าไว้ด้วยกันคั่นด้วยจุลภาค (เช่น 'AUS,UK') การใช้ IN() ไม่ได้ผล เพราะ MySQL จะมองว่าเป็นสตริงเดียว ไม่ใช่หลายค่า

วิธีแก้: ใช้ FIND_IN_SET()

FIND_IN_SET(str, strlist) คืนค่าตำแหน่ง (1-based index) ของ str ใน strlist ที่คั่นด้วยจุลภาค หากไม่พบคืน 0 ใช้ในเงื่อนไข WHERE ได้โดยตรง

ตัวอย่างเต็ม

1. สร้างตาราง

mysql> CREATE TABLE DemoTable1423 (
    CountryName VARCHAR(100)
);

2. เพิ่มข้อมูล

mysql> INSERT INTO DemoTable1423 VALUES ('AUS,UK');
mysql> INSERT INTO DemoTable1423 VALUES ('US');
mysql> INSERT INTO DemoTable1423 VALUES ('AUS,UK,US');

3. ดูข้อมูลทั้งหมด

mysql> SELECT * FROM DemoTable1423;
+-------------+
| CountryName |
+-------------+
| AUS,UK      |
| US          |
| AUS,UK,US   |
+-------------+

4. ค้นหาแถวที่มี 'US'

mysql> SELECT * FROM DemoTable1423 WHERE FIND_IN_SET('US', CountryName);
+-------------+
| CountryName |
+-------------+
| US          |
| AUS,UK,US   |
+-------------+

ข้อควรระวัง

  • ประสิทธิภาพ: FIND_IN_SET() ไม่สามารถใช้ดัชนี (index) ได้ จะทำ Full Table Scan ตารางใหญ่จะช้า
  • รูปแบบข้อมูล: ต้องไม่มีช่องว่างรอบจุลภาค (เช่น 'AUS, UK' จะไม่ตรงกับ 'UK')
  • การออกแบบที่ดีกว่า: ควรปรับโครงสร้างเป็นตารางแยก (Normalization) ใช้ตารางกลาง many-to-many แทน

ตัวเลือกอื่น: REGEXP

SELECT * FROM DemoTable1423 WHERE CountryName REGEXP '[[:<:]]US[[:>:]]';

ใช้ word boundary แบบ regex แต่ก็ไม่ใช้ index ได้เช่นกัน