如何通过一个查询搜索多个单词?

时间:2020-03-01 18:21:44

标签: mysql sql string where-clause sql-like

我正在尝试使用以下查询进行简单的php搜索。这可以完美地工作,但是查询仅给出第一个单词的结果。是否有一种方法可以通过单个查询获得所有三个单词的组合结果?

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

4 个答案:

答案 0 :(得分:2)

您需要重复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(并且将返回表中的所有行);否则,如果都不以1开头,则条件为假,因此只有第一个条件起作用(这就是您所看到的)。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

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

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

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

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

答案 3 :(得分:0)

如果要减少查询执行时间,请使用UNION ALL(与“ OR”出现次数一样多的要合并的部分)。 否则(透明脚本和短脚本)将所有条件都用一行显示-如上所述。