如何用一个查询搜索多个词?

How to search for multiple words with one query?

我正在尝试使用以下查询进行简单的 php 搜索。这非常有效,但是查询只给出第一个单词的结果。有没有办法使用单个查询获得所有三个词的组合结果?

$stmt = $pdo->prepare("SELECT * FROM walldb WHERE (wallname LIKE :searchq1 OR :searchq2 OR :searchq3) LIMIT :stat, :limt");

您不能在您显示的方式中使用OR:searchq2 不是有效的 where 表达式。您需要执行以下操作:

wallname LIKE :searchq1 OR wallname LIKE :searchq2 OR wallname LIKE :searchq3

您需要重复 expr like val 模式:

WHERE wallname LIKE :searchq1 OR wallname LIKE :searchq2 OR wallname LIKE :searchq3

您的原始代码发生了什么,它被解释为:

WHERE 
    (wallname LIKE :searchq1)
    OR (:searchq2)
    OR (:searchq3)

所以基本上最后两个搜索词是在布尔上下文中评估的,就好像它们是条件一样。如果其中一个搜索词以 1 开头,则它被评估为 true(并且将返回 table 中的所有行);否则,如果两者都不以 1 开头,则条件为假,因此只有第一个条件起作用(这就是您所看到的)。

如果您想减少查询执行时间,请使用 UNION ALL(与 'OR' 出现次数一样多的部分合并)。 否则(透明和简短的脚本)在一行中使用所有条件 - 如上所述。

您可能需要考虑正则表达式。您可以将您想要的表达为:

where wallname regexp concat('^', concat_ws('|', :searchq1, :searchq2, :searchq3), '$')

假设参数中没有特殊字符。

但是,也许您应该考虑一个正则表达式。那么你可以将条件表示为:

where allname regexp '^abc|def|ghi$')