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
.