Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Mysql, PHP, tìm kiếm nhiều từ

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 subjectbody . 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 MyISAM để sử dụng FULLTEXT chỉ mục. CẬP NHẬT: Kể từ MySQL 5.6 , 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 .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Quyền thủ tục được lưu trữ trong MySQL

  2. Làm thế nào để có được một kết xuất chính xác bằng cách sử dụng mysqldump và một giao dịch khi DDL được sử dụng cùng một lúc?

  3. MYSQL UNION DISTINCT

  4. Lỗi WAMP / MySQL không đúng ngôn ngữ

  5. PreparedStatement bỏ qua các tham số trong truy vấn:java.sql.SQLException:Chỉ mục tham số nằm ngoài phạm vi (1> số tham số, là 0)