
本文讲解如何通过合理使用括号控制逻辑运算优先级,确保 mysql 查询中一个必需条件(如 `file like '%video%'`)与多个可选条件(如 `title` 或 `description` 匹配搜索词)正确协同工作,避免因 and/or 优先级导致的意外结果。
在构建高级搜索功能时,常需设定「硬性筛选条件」(mandatory condition)与「柔性匹配条件」(optional conditions)。例如:仅返回含视频文件(file 字段包含 'video')的记录,同时要求其标题(title)或描述(description)至少有一项匹配用户搜索关键词——这是一个典型的 AND + (OR) 逻辑结构。
然而,若忽略 SQL 中 AND 的优先级高于 OR,直接写作:
SELECT `id`
FROM `posts`
WHERE `file` LIKE '%video%'
AND `title` LIKE '%{$search_query}%'
OR `description` LIKE '%{$search_query}%';MySQL 会按 (file AND title) OR description 解析,即:只要 description 匹配任意关键词,即使 file 不含 'video',该行也会被返回——这显然违背业务需求。
✅ 正确写法是用圆括号显式分组可选条件,强制执行「先判断是否为视频,再检查标题或描述是否匹配」的逻辑:
SELECT `id`
FROM `posts`
WHERE `file` LIKE '%video%'
AND (
`title` LIKE '%{$search_query}%'
OR `description` LIKE '%{$search_query}%'
);? 关键要点:
- SQL 中 AND 的结合优先级高于 OR,等价于 + 和 * 的数学优先级(AND 如乘法,OR 如加法);
- 括号不是可选项,而是逻辑准确性的必要保障;
- 在实际应用中,建议对 $search_query 进行安全转义(如使用 PDO 预处理语句),防止 SQL 注入:
$stmt = $pdo->prepare(
"SELECT `id` FROM `posts`
WHERE `file` LIKE ?
AND (`title` LIKE ? OR `description` LIKE ?)"
);
$searchLike = "%{$search_query}%";
$stmt->execute(["%video%", $searchLike, $searchLike]);? 扩展提示:若未来需支持更多可选字段(如 tags、caption),只需在括号内追加 OR 子句,主干逻辑保持不变:
AND ( `title` LIKE ? OR `description` LIKE ? OR `tags` LIKE ? OR `caption` LIKE ? )
总之,清晰的逻辑分组 + 严格的参数化处理,是构建健壮搜索查询的两大基石。










