【问题标题】:How to search for multiple words with one query?如何用一个查询搜索多个单词?
【发布时间】:2020-03-01 18:21:44
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    您需要重复expr like val 模式:

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

    您的原始代码发生的情况是它被解释为:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

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

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

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

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

        【讨论】:

        • 对于这个答案,这是一种更清洁的方法 +1。非常感谢:)
        【解决方案4】:

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

        【讨论】:

        • 有趣,用你的方法查询会是什么样子?
        • 嗨。对不起,只是 UNION 而不是 UNION ALL。所以,像这样: SELECT * FROM walldb WHERE wallname LIKE :searchq1 UNION SELECT * FROM walldb WHERE wallname LIKE :searchq2 UNION SELECT * FROM walldb WHERE wallname LIKE :searchq3
        猜你喜欢
        • 1970-01-01
        • 2012-03-12
        • 2015-11-02
        • 1970-01-01
        • 2018-11-26
        • 2020-12-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多