MySQL中商家时段重叠校验查询的AND/OR运算符组合逻辑错误排查
问题分析与解决方案
嘿,这个问题我太熟悉了——核心是MySQL的运算符优先级规则在悄悄搞鬼!
你的查询逻辑为什么跑偏了?
MySQL里AND的优先级比OR高,这意味着你的原语句:
SELECT * FROM merchant_slots WHERE merchantId='14955' AND day='2' AND merchant_slots.start_time BETWEEN '10:00' AND '14:00' OR merchant_slots.end_time BETWEEN '10:00' AND '14:00'
会被MySQL自动解析成这个样子:
SELECT * FROM merchant_slots WHERE (merchantId='14955' AND day='2' AND merchant_slots.start_time BETWEEN '10:00' AND '14:00') OR (merchant_slots.end_time BETWEEN '10:00' AND '14:00')
看到没?OR后面的条件完全脱离了day='2'的约束!你表中id=2的记录end_time是11:00,刚好落在10:00-14:00区间里,所以哪怕day='2'没有数据,这条记录也会被查出来,这就是你看到的错误结果。
修正后的正确语句
要让OR的两个条件都服从merchantId='14955' AND day='2'的约束,你需要给OR的两个条件加上括号,明确逻辑分组:
SELECT * FROM merchant_slots WHERE merchantId='14955' AND day='2' AND (merchant_slots.start_time BETWEEN '10:00' AND '14:00' OR merchant_slots.end_time BETWEEN '10:00' AND '14:00')
额外优化:更全面的时段重叠判断
另外,如果你是要校验同一商家同一日期下的时段重叠,当前的条件其实不够全面——比如如果有一条记录是09:00-15:00,它完全包含了你要检查的10:00-14:00时段,但你的条件会漏掉这种情况。更完整的时段重叠判断逻辑应该是:
SELECT * FROM merchant_slots WHERE merchantId='14955' AND day='2' AND ( start_time < '14:00' AND end_time > '10:00' )
这个逻辑能覆盖所有重叠场景:
- 目标时段包含记录时段
- 记录时段包含目标时段
- 两者部分重叠
验证效果
用修正后的语句查询day='2'时,因为表中没有对应日期的数据,会返回空结果,完全符合你的预期。
内容的提问来源于stack exchange,提问作者Ritika
相关产品推荐
相关产品推荐

