如何用一个查询搜索多个词?
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$')
我正在尝试使用以下查询进行简单的 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$')