ปัญหา
เมื่อคอลัมน์หนึ่งเก็บหลายค่าไว้ด้วยกันคั่นด้วยจุลภาค (เช่น '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 ได้เช่นกัน