[英]Mysql, PHP, searching for multiple words
我正在嘗試在表格中搜索特定的單詞。
說我有一個單詞列表:打印機,網絡,無線,緊急
我只想返回所有這些單詞都在其中的那些行。
SELECT * FROM tickets WHERE concat(subject,body) REGEXP "printer|network|wireless|urgent"
將返回任何一行中的任何一行。 我怎樣才能使它只返回所有這些單詞都在其中的那些行。
謝謝,
有兩種方法可以做到這一點。 首先是相當明顯的方法。 假設您有所有需要顯示在名為$ necessaryWords的數組中的單詞:
$sql = 'SELECT ... FROM ...'; // and so on
$sql .= ' WHERE 1';
foreach ($necessaryWords as $word)
$sql .= ' AND concat(subject,body) LIKE "%' . $word . '%"'; //Quotes around string
但是,由於無法使用索引,因此使用%foo%
的速度相當慢,因此此查詢可能會因龐大的表和/或大量必要的單詞而導致性能問題。
另一種方法是在subject
和body
上使用FULLTEXT
索引。 您可以像這樣使用全文MATCH IN BOOLEAN MODE
:
$sql = 'SELECT ... FROM ...'; // and so on
$sql .= ' WHERE MATCH(subject,body) AGAINST("';
foreach ($necessaryWords as $word)
$sql .= ' +' . $word;
$sql .= '")';
請注意,您的表必須使用 更新: 從MySQL 5.6開始 , MyISAM
才能使用FULLTEXT
索引。InnoDB
支持FULLTEXT
索引。 我猜這可能是更好的選擇性能明智的選擇。 在布爾模式下全文的更多文檔可以在手冊中找到。
不是最好的方式,但是:
SELECT * FROM tickets WHERE
concat(subject,body) REGEXP "printer" AND
concat(subject,body) REGEXP "network" AND
concat(subject,body) REGEXP "wireless" AND
concat(subject,body) REGEXP "urgent"
SELECT * FROM tickets WHERE
concat(subject,body) LIKE "%printer%" AND
concat(subject,body) LIKE "%network%" AND
concat(subject,body) LIKE "%wireless%" AND
concat(subject,body) LIKE "%urgent%"
不確定這適用於MySQL正則表達式引擎,但下面的正則表達式(使用lookarounds)可以實現您正在尋找的。 無論發生的順序如何,都會找到感興趣的詞:
^(?=.*printer)(?=.*network)(?=.*wireless)(?=.*urgent).*$
演示: http : //www.rubular.com/r/XcVz5xMZcb
此處提供一些正則表達式的環回示例: http : //www.rexegg.com/regex-lookarounds.html
另一種答案,只是因為當我查看你的問題時我想到了它。 我不知道它是否比其他答案更快(很可能沒有):
(SELECT * FROM tickets WHERE subject LIKE "%printer%" OR body LIKE "%printer%")
UNION
(SELECT * FROM tickets WHERE subject LIKE "%network%" OR body LIKE "%network%")
UNION
(SELECT * FROM tickets WHERE subject LIKE "%wireless%" OR body LIKE "%wireless%")
UNION
(SELECT * FROM tickets WHERE subject LIKE "%urgent%" OR body LIKE "%urgent%")
更新:這是錯誤的
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.