Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Lấy bản ghi "Jone Deo" hoặc "Deo Jone" bằng một truy vấn MySQL

Sử dụng mệnh đề LIKE kết hợp SUBSTRING_INDEX để tìm kiếm linh hoạt thứ tự từ.

Tạo bảng demo

mysql> create table DemoTable (
    -> ClientName varchar(100)
    -> );
Query OK, 0 rows affected (0.85 sec)

Chèn dữ liệu

mysql> insert into DemoTable values('John Smith');
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable values('Smith John');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable values('Jone Deo');
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable values('Deo Jone');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values('Chris Brown');
Query OK, 1 row affected (0.15 sec)

Hiển thị dữ liệu

mysql> select * from DemoTable;

Kết quả

+-------------+
| ClientName  |
+-------------+
| John Smith  |
| Smith John  |
| Jone Deo    |
| Deo Jone    |
| Chris Brown |
+-------------+
5 rows in set (0.00 sec)

Truy vấn lấy "Jone Deo" hoặc "Deo Jone"

mysql> select * from DemoTable
    -> where ClientName
    -> LIKE
    -> (SELECT SUBSTRING_INDEX("%Jone% %Deo%", " ", -1))
    -> or
    -> (SELECT SUBSTRING_INDEX("%Deo% %Jone%", " ", 1));

Kết quả

+------------+
| ClientName |
+------------+
| Jone Deo   |
| Deo Jone   |
+------------+
2 rows in set (0.00 sec)

Giải thích truy vấn gốc (phức tạp): Sử dụng SUBSTRING_INDEX để tách pattern, nhưng cách này hơi "hard-code" và khó hiểu.

Cách đơn giản, rõ ràng hơn:

SELECT * FROM DemoTable
WHERE ClientName LIKE '%Jone%Deo%' 
   OR ClientName LIKE '%Deo%Jone%';

Hoặc dùng REGEXP (MySQL 8.0+):

WHERE ClientName REGEXP 'Jone.*Deo|Deo.*Jone'

Lưu ý: Cách dùng LIKE '%...%...%' không dùng được index, phù hợp cho dữ liệu nhỏ/vừa. Với dữ liệu lớn, cân nhắc Full-Text Search hoặc tách cột first_name, last_name.