PHP+MySQL中校验商户时段冲突的SQL查询失效问题及解决方案咨询
校验时段重叠的正确SQL逻辑
嘿,你的问题很常见——时段重叠的校验逻辑很容易搞反条件,我来帮你理清楚。
首先,你原来写的SQL条件'08:00' > start_time AND end_time < '12:00'其实是在找完全被新时段包含的旧时段,但这只是重叠情况的一种,而且逻辑方向错了。实际上,两个时段只要满足「新时段开始于旧时段结束前,且新时段结束于旧时段开始后」,就属于重叠。
结合你的merchant_slots表,我们还要加上merchantId和day的过滤——毕竟不同商家或者不同日期的时段肯定不冲突对吧?
正确的冲突校验SQL
假设你要插入的时段是:merchantId=1、day=1、start_time='08:00'、end_time='12:00',对应的校验SQL应该是:
SELECT * FROM merchant_slots WHERE merchantId = 1 AND day = 1 AND '08:00' < end_time AND '12:00' > start_time;
逻辑解释
这个条件覆盖了所有可能的重叠场景:
- 新时段的开始时间落在旧时段的区间内(比如旧时段是09:00-10:00,新时段08:00-12:00)
- 新时段的结束时间落在旧时段的区间内
- 新时段完全包含旧时段
- 旧时段完全包含新时段
如果这个查询返回了任何结果,就说明存在冲突,不能执行插入;如果没有返回结果,就可以安全插入新的时段。
进阶建议
为了避免重复校验,你可以把这个逻辑封装起来:
- 在应用层:插入前先执行这个查询,根据结果判断是否允许插入
- 在数据库层:创建一个触发器,在插入/更新前自动执行这个校验,一旦发现冲突就抛出错误(不同数据库的触发器语法略有不同,比如MySQL用BEFORE INSERT触发器,PostgreSQL用BEFORE INSERT OR UPDATE触发器)
内容的提问来源于stack exchange,提问作者Ritika
相关产品推荐
相关产品推荐

