Có hai cách để làm điều này. Đầu tiên là cách tiếp cận khá rõ ràng. Giả sử bạn có tất cả các từ cần xuất hiện trong một mảng có tên là $ needWords:
$sql = 'SELECT ... FROM ...'; // and so on
$sql .= ' WHERE 1';
foreach ($necessaryWords as $word)
$sql .= ' AND concat(subject,body) LIKE "%' . $word . '%"'; //Quotes around string
Tuy nhiên, sử dụng %foo%
khá chậm, vì không có chỉ mục nào có thể được sử dụng, vì vậy truy vấn này có thể gây ra các vấn đề về hiệu suất với các bảng lớn và / hoặc số lượng từ cần thiết cao.
Cách tiếp cận khác sẽ là FULLTEXT
lập chỉ mục trên subject
và body
. Bạn có thể sử dụng MATCH IN BOOLEAN MODE
đầy đủ văn bản như thế này:
$sql = 'SELECT ... FROM ...'; // and so on
$sql .= ' WHERE MATCH(subject,body) AGAINST("';
foreach ($necessaryWords as $word)
$sql .= ' +' . $word;
$sql .= '")';
Lưu ý rằng bảng của bạn phải sử dụng CẬP NHẬT: Kể từ MySQL 5.6
, MyISAM
để sử dụng FULLTEXT
chỉ mục. InnoDB
hỗ trợ FULLTEXT
các chỉ mục cũng vậy. Tôi đoán đây có thể là sự lựa chọn tốt hơn về hiệu suất khôn ngoan. Bạn có thể tìm thêm tài liệu về văn bản đầy đủ ở chế độ boolean trong hướng dẫn sử dụng
.