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

MySQL酒店数据库重复预订查询方案求助(附测试数据)

用自连接检测酒店重复预订

针对你的需求——找出同一房间且日期重叠的重复预订,用自连接(SELF JOIN)是最直接的方案,完全符合老师的提示。

最终查询语句

SELECT
    r1.ResNr AS 预订编号1,
    r1.RoomNr AS 房间号,
    r1.FromDate AS 入住日期1,
    r1.ToDate AS 退房日期1,
    r2.ResNr AS 预订编号2,
    r2.FromDate AS 入住日期2,
    r2.ToDate AS 退房日期2
FROM
    Roomreservation r1
JOIN
    Roomreservation r2
ON
    r1.RoomNr = r2.RoomNr
    AND r1.ResNr < r2.ResNr
    AND r1.FromDate < r2.ToDate
    AND r1.ToDate > r2.FromDate;

关键逻辑解释

  • 匹配同一房间:r1.RoomNr = r2.RoomNr 限定只对比同一房间的预订记录。
  • 避免重复结果:r1.ResNr < r2.ResNr 确保每组重叠预订只显示一次(不会出现A和B、B和A两次重复输出)。
  • 检测日期重叠:r1.FromDate < r2.ToDate AND r1.ToDate > r2.FromDate 是判断时间段重叠的通用逻辑,能覆盖所有重叠场景:
    • 甲预订完全包含乙预订
    • 乙预订完全包含甲预订
    • 甲的入住日期落在乙的预订期内
    • 甲的退房日期落在乙的预订期内

测试数据执行结果

用你提供的测试数据运行上述语句,会得到:

预订编号1 | 房间号 | 入住日期1   | 退房日期1   | 预订编号2 | 入住日期2   | 退房日期2
---------|--------|-------------|-------------|---------|-------------|-------------
51       | 102    | 2008-12-05  | 2008-12-07  | 53       | 2008-12-04  | 2008-12-10

这正是房间102的两组重叠预订,完全符合需求。

关于concat_ws的误区

concat_ws是字符串拼接函数,和时间段重叠检测的逻辑无关,所以用它解决这个问题方向不对,自连接才是正确的思路。

内容的提问来源于stack exchange,提问作者Jane Doe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 08:40:27