我正在尝试使用以下查询进行简单的php搜索。这可以完美地工作,但是查询仅给出第一个单词的结果。是否有一种方法可以通过单个查询获得所有三个单词的组合结果?
$stmt = $pdo->prepare("SELECT * FROM walldb WHERE (wallname LIKE :searchq1 OR :searchq2 OR :searchq3) LIMIT :stat, :limt");
答案 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”出现次数一样多的要合并的部分)。 否则(透明脚本和短脚本)将所有条件都用一行显示-如上所述。