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

Kết hợp nhiều cột thành một chuỗi để tìm kiếm (CONCAT) trong MySQL

Hàm CONCAT() cho phép ghép nhiều cột thành một chuỗi duy nhất, rất hữu ích khi cần tìm kiếm, so sánh hoặc hiển thị trên tổ hợp nhiều trường (ví dụ: Họ + Tên).

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

mysql> CREATE TABLE DemoTable (
    ClientId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    ClientFirstName VARCHAR(20),
    ClientLastName VARCHAR(20)
);

mysql> INSERT INTO DemoTable (ClientFirstName, ClientLastName) VALUES
('John', 'Smith'), ('John', 'Miller'), ('Carol', 'Taylor'), ('Adam', 'Smith');

Dữ liệu

mysql> SELECT * FROM DemoTable;
+----------+-----------------+----------------+
| ClientId | ClientFirstName | ClientLastName |
+----------+-----------------+----------------+
|        1 | John            | Smith          |
|        2 | John            | Miller         |
|        3 | Carol           | Taylor         |
|        4 | Adam            | Smith          |
+----------+-----------------+----------------+

Tìm ClientId của người có Họ 'John' (FirstName bắt đầu bằng 'Jo')

Ghép FirstName + ' ' + LastName rồi dùng LIKE:

mysql> SELECT ClientId FROM DemoTable 
WHERE CONCAT(ClientFirstName, ' ', ClientLastName) LIKE 'Jo%';

Kết quả

+----------+
| ClientId |
+----------+
|        1 |
|        2 |
+----------+

Giải thích

  • CONCAT(ClientFirstName, ' ', ClientLastName): Tạo chuỗi "John Smith", "John Miller", "Carol Taylor", "Adam Smith".
  • LIKE 'Jo%': Khớp chuỗi bắt đầu bằng "Jo" -> "John Smith", "John Miller".

Mở rộng: Tìm kiếm Full Name không phân biệt thứ tự

Nếu người dùng tìm "Smith John" (Họ trước, Tên sau), dùng OR hoặc CONCAT hai chiều:

WHERE CONCAT(ClientFirstName, ' ', ClientLastName) LIKE '%John%Smith%'
   OR CONCAT(ClientLastName, ' ', ClientFirstName) LIKE '%John%Smith%'

Hiệu năng & Best Practice

  • CONCAT trong WHERE không dùng index trên cột gốc.
  • Tạo Generated Column lưu FullName và index trên nó (MySQL 5.7+):
ALTER TABLE DemoTable 
ADD FullName VARCHAR(41) AS (CONCAT(ClientFirstName, ' ', ClientLastName)) STORED;
CREATE INDEX idx_fullname ON DemoTable (FullName);

Sau đó query: WHERE FullName LIKE 'Jo%' -> dùng index, rất nhanh.