สามารถจัดเรียงผลลัพธ์การค้นหาตามตำแหน่งที่พบ substring ในคอลัมน์ได้โดยใช้ ORDER BY LOCATE('substring', column_name) ค่าที่พบ substring ก่อนหน้า (ตำแหน่งเล็ก) จะอยู่ด้านบน
Syntax
SELECT * FROM table_name
WHERE column_name LIKE '%substring%'
ORDER BY LOCATE('substring', column_name);
ตัวอย่างการใช้งาน
1. สร้างตารางและเพิ่มข้อมูล
mysql> create table DemoTable1838 ( Subject varchar(100) ); Query OK, 0 rows affected (0.00 sec)
mysql> insert into DemoTable1838 values('MongoDB MySQL'); Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1838 values('MySQL Java'); Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1838 values('JavaWithMySQL'); Query OK, 1 row affected (0.00 sec)
ข้อมูลทั้งหมด:
mysql> select * from DemoTable1838;
+---------------+ | Subject | +---------------+ | MongoDB MySQL | | MySQL Java | | JavaWithMySQL | +---------------+ 3 rows in set (0.00 sec)
2. ค้นหาและจัดเรียงตามตำแหน่ง 'MySQL'
mysql> select * from DemoTable1838
-> where Subject LIKE '%MySQL%'
-> ORDER BY LOCATE('MySQL', Subject);
ผลลัพธ์:
+---------------+ | Subject | +---------------+ | MySQL Java | -- ตำแหน่ง 1 | MongoDB MySQL | -- ตำแหน่ง 9 | JavaWithMySQL | -- ตำแหน่ง 10 +---------------+ 3 rows in set (0.00 sec)
ฟังก์ชัน LOCATE()
LOCATE(substring, string, [start_position])
- คืนค่าตำแหน่งแรกที่พบ substring (เริ่มที่ 1)
- คืนค่า 0 ถ้าไม่พบ
- พารามิเตอร์ที่ 3 ระบุตำแหน่งเริ่มค้นหา (optional)
การใช้งานขั้นสูง
จัดเรียง: พบ substring ก่อน → ตามลำดับปกติ
SELECT * FROM table_name
ORDER BY
CASE WHEN column_name LIKE '%search%' THEN 0 ELSE 1 END, -- พบก่อน
LOCATE('search', column_name); -- แล้วค่อยเรียงตามตำแหน่ง
ค้นหาหลายคำ และจัดเรียงตามคำแรกที่พบ
SELECT *,
LEAST(
NULLIF(LOCATE('MySQL', Subject), 0),
NULLIF(LOCATE('Java', Subject), 0)
) as first_pos
FROM DemoTable1838
WHERE Subject LIKE '%MySQL%' OR Subject LIKE '%Java%'
ORDER BY first_pos;
สรุป: ใช้ ORDER BY LOCATE('substring', column) เพื่อจัดอันดับผลลัพธ์ตามตำแหน่งที่คำค้นหาปรากฏ ค่าที่ปรากฏเร็วกว่า (ตำแหน่งเล็ก) จะอยู่บนสุด