簡體   English   中英

Mysql,PHP,搜索多個單詞

[英]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%的速度相當慢,因此此查詢可能會因龐大的表和/或大量必要的單詞而導致性能問題。

另一種方法是在subjectbody上使用FULLTEXT索引。 您可以像這樣使用全文MATCH IN BOOLEAN MODE

$sql = 'SELECT ... FROM ...'; // and so on
$sql .= ' WHERE MATCH(subject,body) AGAINST("';

foreach ($necessaryWords as $word)
    $sql .= ' +' . $word;
$sql .= '")';

請注意,您的表必須使用MyISAM才能使用FULLTEXT索引。 更新: 從MySQL 5.6開始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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM