SQL查询如何获取仅在1个相同日期有共同预订的唯一邮箱对
正确SQL查询实现说明
原参考代码问题
你提供的起始代码存在3处明显错误:
- 关联表名拼写错误:
hotelboeking应为目标表HotelBooking - JOIN关联规则错误:不应该关联
email字段(我们需要匹配不同邮箱的配对),也不存在tijdstip字段,应该按共同的dateOfBooking做关联 - 缺少核心逻辑:没有统计两个邮箱的共同预订日期数量,也没有过滤恰好1个共同日期的条件
最终实现代码
SELECT hb1.email AS email1, hb2.email AS email2 FROM HotelBooking hb1 INNER JOIN HotelBooking hb2 ON hb1.dateOfBooking = hb2.dateOfBooking AND hb1.email < hb2.email GROUP BY hb1.email, hb2.email HAVING COUNT(DISTINCT hb1.dateOfBooking) = 1;
逻辑说明
- 用
hb1.email < hb2.email过滤同邮箱的无效配对,同时避免生成重复二元组(比如(a@xx.com,b@xx.com)和(b@xx.com,a@xx.com)只会保留1组),符合唯一二元组的要求 COUNT(DISTINCT hb1.dateOfBooking)统计两个邮箱的共同预订日期数量,=1的筛选条件恰好匹配「仅在1个相同日期有共同预订、排除多日期共同预订」的需求- 如果你需要同时返回对应的共同预订日期,可以在SELECT后追加
MAX(hb1.dateOfBooking) AS common_booking_date,因为HAVING已经限定共同日期只有1个,MAX/MIN函数都可以准确取到该日期
内容的提问来源于stack exchange,提问作者Davin Vroegop
相关产品推荐
相关产品推荐

