
本文讲解如何通过合理使用括号来确保 mysql 查询中必选条件(and)与可选条件(or)的逻辑优先级,避免因运算符优先级导致的意外结果。
在构建高级搜索功能时,常需设定一个强制过滤条件(如仅返回含视频文件的记录),再叠加多个可选匹配条件(如标题或描述中包含关键词)。但若忽略 SQL 中 AND 与 OR 的默认优先级,极易导致查询逻辑失效。
MySQL 中 AND 的优先级高于 OR,这意味着以下原始写法:
SELECT `id`
FROM `posts`
WHERE `file` LIKE '%video%'
AND `title` LIKE '%{$search_query}%'
OR `description` LIKE '%{$search_query}%';实际等价于:
SELECT `id`
FROM `posts`
WHERE (`file` LIKE '%video%' AND `title` LIKE '%{$search_query}%')
OR `description` LIKE '%{$search_query}%';即:只要 description 匹配任意关键词,无论 file 是否含 "video",该行都会被返回——这显然违背了业务需求。
✅ 正确做法是显式用括号提升 OR 条件的组合范围,确保 AND 作用于整个 (title OR description) 组合:
SELECT `id`
FROM `posts`
WHERE `file` LIKE '%video%'
AND (`title` LIKE '%{$search_query}%'
OR `description` LIKE '%{$search_query}%');这样,SQL 强制先判断 file 是否满足视频条件(必选),再检查标题或描述中是否至少有一项匹配关键词(可选),逻辑清晰且结果可控。
⚠️ 注意事项:
- 永远不要依赖运算符默认优先级编写复合条件;涉及 AND + OR 混用时,务必用括号明确分组;
- 实际开发中,$search_query 必须经过参数化处理(如 PDO 预处理语句),严禁直接拼接,以防 SQL 注入;
- 若需支持多字段模糊匹配,还可扩展为 (titleORdescriptionORtags),但始终将整个 OR 组置于一对括号内,并与 AND 条件并列。
总结:括号不是可选项,而是 SQL 逻辑准确性的关键保障。一次正确的分组,胜过十次调试排查。










