MySQL ค้นหาข้อมูลจาก field ที่เก็บข้อมูลโดยมี comma คั่น ด้วย FIND_IN_SET

วันที่: 13 ก.พ. 2565 21:14 น.

MySQL ค้นหาข้อมูลจาก field ที่เก็บข้อมูลโดยมี comma คั่น ด้วย FIND_IN_SET

คุณเคยเก็บข้อมูลใน database ใน field เดียวกันแต่ใช้ comma ขั้นไหม ? เช่น เก็บหมวดหมู่ หรือ tag ของบทความต่าง ๆ หรือ เช่นแบบนี้

+----+--------------------------------+
| id | name                           |
+----+--------------------------------+
|  1 | John,Carol,Sam,Larry,Bob,David |
|  2 | Maxwell,Chris,James            |
|  3 | Robert,Ramit                   |
+----+--------------------------------+

จะเห็นว่าการที่จะค้นหา record ที่มีชื่อ James นั้น จะใช้ = หรือ LIKE ก็ไม่ได้แล้ว หรืออาจจะได้แต่ต้องเขียนค่อนข้างเยอะเลย แต่ในบทความนี้จะพาทำวิธีง่าย ๆ ด้วย function FIND_IN_SET ใน MySQL 

วิธีเรียกใช้งานก็ทำได้ง่าย ๆ ด้วยคำสั่งดังนี้

SELECT * FROM ชื่อตาราง WHERE FIND_IN_SET('ข้อมูลที่ต้องการค้นหา',ชื่อฟิลด์ที่เก็บ) > 0;

มาทดลองกันเลยครับ

สร้างตาราง commaData โดยใช้คำสั่ง

create table commaData
    -> (
    -> id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> name varchar(200)
    -> );
Query OK, 0 rows affected (0.041 sec)

จากนั้นใส่ค่าลงไปในตาราง ด้วยคำสั่งนี้

insert into commaData(Name) values('John,Carol,Sam,Larry,Bob,David');
Query OK, 1 row affected (0.008 sec)

MariaDB [test]> insert into commaData(Name) values('Maxwell,Chris,James');
Query OK, 1 row affected (0.001 sec)

MariaDB [test]> insert into commaData(Name) values('Robert,Ramit');
Query OK, 1 row affected (0.002 sec)

แล้วลองเรียกข้อมูลดู

select * from commaData;
+----+--------------------------------+
| id | name                           |
+----+--------------------------------+
|  1 | John,Carol,Sam,Larry,Bob,David |
|  2 | Maxwell,Chris,James            |
|  3 | Robert,Ramit                   |
+----+--------------------------------+
3 rows in set (0.001 sec)

แล้วสุดท้ายลองใช้ function FIND_IN_SET ค้นหา โดยคำสั่งง่าย ๆ ดังนี้

SELECT * FROM commaData WHERE FIND_IN_SET('James',Name) > 0;
+----+---------------------+
| id | name                |
+----+---------------------+
|  2 | Maxwell,Chris,James |
+----+---------------------+
1 row in set (0.002 sec)

ผลเป็นที่น่าพอใจครับ ลองนำไปใช้ดูนะครับ

เรื่องอื่น ๆ ที่เกี่ยวข้อง