我使用以下内容查询数据库:
SELECT * FROM DB.table WHERE
hidden = 0 AND
column1 LIKE '%$search%' OR
column2 LIKE '%$search%';
但是,即使隐藏列为1,它仍会输出查询。
这可能很简单,但我想我已经看了太多。
答案 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
。全文索引通常是此类查询的最佳解决方案,尤其是在您关心性能的情况下。