MySQL查询:选取bookingid相同的酒店预订表数据
找出所有bookingid重复的酒店预订记录
要获取表中所有属于重复bookingid的记录,这里有几种实用的MySQL查询方法,你可以根据自己的MySQL版本和表的大小选择合适的方式:
方法1:使用子查询+IN子句
这是最直观的写法,先筛选出出现多次的bookingid,再匹配原表的记录:
SELECT * FROM your_table_name WHERE bookingid IN ( SELECT bookingid FROM your_table_name GROUP BY bookingid HAVING COUNT(*) > 1 );
原理:内层子查询通过GROUP BY bookingid分组,并用HAVING COUNT(*) > 1筛选出出现次数超过1的bookingid;外层查询则把这些bookingid对应的所有记录都提取出来。
方法2:使用JOIN关联子查询
如果你的表数据量较大,JOIN的方式通常比IN子句性能更优:
SELECT t.* FROM your_table_name t JOIN ( SELECT bookingid FROM your_table_name GROUP BY bookingid HAVING COUNT(*) > 1 ) dup ON t.bookingid = dup.bookingid;
原理:和方法1逻辑一致,只是用JOIN替代IN来关联原表和重复bookingid的集合,在大数据量下执行效率更高。
方法3:使用窗口函数(MySQL 8.0+适用)
如果你使用的是MySQL 8.0及以上版本,窗口函数可以让写法更简洁,不需要额外的关联操作:
SELECT id, room, night, bookingid, timestamp FROM ( SELECT *, COUNT(*) OVER(PARTITION BY bookingid) AS booking_count FROM your_table_name ) sub WHERE booking_count > 1;
原理:内层查询用COUNT(*) OVER(PARTITION BY bookingid)计算每个bookingid对应的记录总数,外层直接筛选出总数大于1的记录即可。
注意事项
记得把查询中的your_table_name替换成你实际的酒店预订表名称哦~
内容的提问来源于stack exchange,提问作者Salwa El Bannan
相关产品推荐
相关产品推荐

