
本文讲解如何通过合理使用括号控制逻辑运算符优先级,确保 sql 查询中一个必选条件(如文件类型)与多个可选条件(如标题或描述匹配)正确协同工作,避免因 and/or 优先级导致的意外结果。
在构建高级搜索功能时,常见需求是:必须满足某一核心条件(如 file 字段包含 "video"),同时至少满足其他若干可选条件之一(如 title 或 description 包含关键词)。初学者常误写为:
SELECT `id`
FROM `posts`
WHERE `file` LIKE '%video%'
AND `title` LIKE '%{$search_query}%'
OR `description` LIKE '%{$search_query}%';该语句实际等价于:
WHERE (`file` LIKE '%video%' AND `title` LIKE '%...%') OR `description` LIKE '%...%';
由于 AND 优先级高于 OR,MySQL 会先计算前两个条件的 AND 结果,再与第三个条件 OR,导致只要 description 匹配,无论 file 是否含 "video",整行都会被返回——这显然违背业务逻辑。
✅ 正确做法是用圆括号显式分组可选条件,强制 title 或 description 的匹配作为一个整体,再与必选条件 AND:
SELECT `id`
FROM `posts`
WHERE `file` LIKE '%video%'
AND (
`title` LIKE '%{$search_query}%'
OR `description` LIKE '%{$search_query}%'
);这样逻辑清晰且可靠:只有当 file 含 "video" 且(title 匹配 或 description 匹配)时,记录才被选中。
⚠️ 注意事项:
- 永远不要依赖运算符默认优先级编写多条件 AND/OR 混合查询;括号是可读性与正确性的双重保障;
- 实际开发中,建议对 $search_query 进行严格转义(如使用 PDO 预处理语句),防止 SQL 注入;
- 若需支持更复杂的搜索(如多字段模糊匹配、权重排序),可进一步结合 FULLTEXT 索引或 MATCH ... AGAINST 提升性能与相关性。
总结:括号不是可选项,而是 SQL 逻辑表达的基石。一次正确的分组,胜过十次调试错误结果。










