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

Triển khai nhiều điều kiện LIKE trong một truy vấn MySQL

Để kết hợp nhiều điều kiện LIKE trên các cột khác nhau trong một truy vấn, dùng toán tử logic AND, OR và ngoặc đơn để nhóm đúng thứ tự ưu tiên.

Cú pháp chung

SELECT * FROM ten_bang
WHERE (cot1 LIKE '%gia_tri1%' OR cot2 LIKE '%gia_tri2%')
   OR (cot3 LIKE '%gia_tri3%');

Ví dụ minh họa

Tạo bảng khách hàng:

mysql> CREATE TABLE DemoTable1534 (
    -> ClientId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> ClientName VARCHAR(20), ClientAge INT, ClientCountryName VARCHAR(20)
    -> );
mysql> INSERT INTO DemoTable1534(ClientName,ClientAge,ClientCountryName) VALUES
    -> ('Chris Brown',29,'AUS'), ('David Miller',49,'UK'),
    -> ('John Doe',43,'US'), ('Adam Smith',38,'US'), ('Carol Taylor',36,'UK');

Truy vấn: Khách hàng có tên chứa 'Doe' **HOẶC** tuổi chứa '38' **HOẶC** quốc gia kết thúc bằng 'S':

mysql> SELECT * FROM DemoTable1534
    -> WHERE ClientName LIKE '%Doe%'
    ->    OR ClientAge LIKE '%38%'
    ->    OR ClientCountryName LIKE '%S';

Kết quả (3 hàng khớp ít nhất 1 điều kiện):

+----------+-------------+-----------+-------------------+
| ClientId | ClientName  | ClientAge | ClientCountryName |
+----------+-------------+-----------+-------------------+
|        1 | Chris Brown |        29 | AUS               |  -- AUS kết thúc S
|        3 | John Doe    |        43 | US                |  -- tên có Doe, US kết thúc S
|        4 | Adam Smith  |        38 | US                |  -- tuổi có 38, US kết thúc S
+----------+-------------+-----------+-------------------+

Lưu ý: MySQL cảnh báo "5 warnings" do so sánh số (ClientAge INT) với chuỗi LIKE '%38%' – MySQL tự ép kiểu, nên dùng ClientAge = 38 cho chính xác.

Best practice

  • Dùng ngoặc đơn rõ ràng: (A OR B) AND (C OR D).
  • Tránh LIKE trên cột số – dùng so sánh bằng (=, BETWEEN).
  • Index không hỗ trợ LIKE '%...%' (bắt đầu bằng wildcard). Chỉ LIKE 'abc%' (prefix) mới dùng được index.
  • Với tìm kiếm toàn văn bản phức tạp, dùng Full-Text Search (MATCH ... AGAINST).