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

จัดเรียงผลลัพธ์ตามตำแหน่ง Substring ใน MySQL ด้วย ORDER BY LOCATE

สามารถจัดเรียงผลลัพธ์การค้นหาตามตำแหน่งที่พบ 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) เพื่อจัดอันดับผลลัพธ์ตามตำแหน่งที่คำค้นหาปรากฏ ค่าที่ปรากฏเร็วกว่า (ตำแหน่งเล็ก) จะอยู่บนสุด