You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 09:09:05