SQL语法和OR子句问题

时间:2015-12-05 16:18:25

标签: mysql where-clause

我使用以下内容查询数据库:

SELECT * FROM DB.table WHERE 
hidden = 0 AND
column1 LIKE '%$search%' OR
column2 LIKE '%$search%';

但是,即使隐藏列为1,它仍会输出查询。

这可能很简单,但我想我已经看了太多。

3 个答案:

答案 0 :(得分:5)

将括号括在OR条件下。

默认情况下的优先顺序是这样的:

    (hidden = 0 AND column1 LIKE '%$search%')
OR  (column2 LIKE '%$search%')

你希望它以这种方式行事:

    (hidden = 0)
AND (column1 LIKE '%$search%' OR column2 LIKE '%$search%')

如果您曾经研究过布尔代数或逻辑,您可能会记得逻辑AND 与常规乘法相似,而逻辑OR 与加法相对应。因此,如果你考虑初中代数课程的操作顺序,这是记住这一点的好方法。当您在查询中看到OR时,您可能会养成检查此内容的习惯。

答案 1 :(得分:3)

    SELECT * FROM DB.table WHERE 
    hidden = 0 AND   
    (column1 LIKE '%$search%' OR 
    column2 LIKE '%$search%');

答案 2 :(得分:2)

您的查询被解析为:

SELECT *
FROM DB.table
WHERE (hidden = 0 AND
       column1 LIKE '%$search%'
      ) OR
      column2 LIKE '%$search%';

因为AND / OR的优先规则。有几种方法可以解决这个问题:

SELECT *
FROM DB.table
WHERE hidden = 0 AND
      (column1 LIKE '%$search%' OR column2 LIKE '%$search%');

有时,连接LIKE

的字段很方便
SELECT *
FROM DB.table
WHERE hidden = 0 AND
      CONCAT(column1, ' ', column2) LIKE '%$search%'

(这不完全一样。)

如果您正在进行此类搜索,您可能应该了解match。全文索引通常是此类查询的最佳解决方案,尤其是在您关心性能的情况下。