SQL 语法 AND OR 子句问题

SQL Syntax AND OR clause issues

我正在使用以下查询数据库:

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

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

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

OR 条件括起来。

默认的优先级是这样的:

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

您希望它以这种方式运行:

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

如果您曾经学习过布尔代数或逻辑,您可能还记得 logical AND 与正则乘法相似,而 logical OR 具有对应加法。因此,如果您考虑初中代数 class 中的运算顺序,这是记住这一点的好方法。您可能会养成每次在查询中看到 OR 时检查它的习惯。

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

您的查询被解析为:

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。全文索引通常是此类查询的最佳解决方案,尤其是在您关心性能的情况下。