多AND/OR条件WHERE子句编写:查询admin创建的所有agenda预约记录
原有SQL的问题
- 逻辑优先级错误:SQL中
AND的运算优先级高于OR,你没有将两类预约的判断条件放在同一个括号内,导致整体判断逻辑完全不符合预期,会把不符合过滤条件的记录也查出来 - 语法错误:条件中
agenda.$user_id多写了不必要的表前缀agenda.,$user_id是外部传入的管理员ID变量,不需要关联表字段 - 冗余重复判断:
agenda_users.user_id = agenda.user_id是两个表的固定关联条件,不需要在每个OR分支中重复书写 - 隐性连接可读性差:用逗号分隔表的隐性连接写法容易遗漏关联条件,维护难度高
正确查询语句
SELECT agenda.* FROM agenda INNER JOIN agenda_users ON agenda_users.agenda_id = agenda.id AND agenda_users.user_id = agenda.user_id WHERE (agenda.user_id = $user_id OR agenda.booked_user = $user_id) AND checkout IS NULL AND NOW() < DATE_ADD(date_end, INTERVAL 6 HOUR) ORDER BY type ASC, date_start ASC
逻辑说明
- 用显式
INNER JOIN声明两表的关联关系,关联条件统一放在ON子句中,逻辑更清晰 - 括号包裹的
agenda.user_id = $user_id OR agenda.booked_user = $user_id覆盖了两类场景:- 管理员为自己预约:
agenda.user_id存储管理员ID,booked_user无值 - 管理员为他人预约:
agenda.booked_user存储管理员ID,agenda.user_id存储实际使用人ID
- 管理员为自己预约:
- 其余过滤条件(未结账、时间限制)和排序规则和原有需求保持一致
内容的提问来源于stack exchange,提问作者Marinario Agalliu
相关产品推荐
相关产品推荐

