如何将售票数统计结果用于WHERE条件?SQL多表查询问题
查询仍有余座电影的实现方法
当然可以实现这个需求,以下是几种常用的具体实现方式:
方法一:关联子查询
将统计售票数的查询作为子查询,通过movie_id与主查询关联,同时用COALESCE处理无售票记录的电影(避免NULL值导致计算异常):
SELECT m.movie_id FROM movies m JOIN rooms r ON m.room_id = r.room_id WHERE r.seats - ( SELECT COALESCE(COUNT(*), 0) FROM tickets t WHERE t.movie_id = m.movie_id ) > 0;
注:
COALESCE(COUNT(*), 0)的作用是把无售票记录时返回的NULL转为0,确保没卖票的电影只要影厅有座位就会被筛选出来。
方法二:JOIN聚合临时表
先对tickets表分组统计售票数,再通过LEFT JOIN关联到电影和影厅的关联表,同样处理无售票记录的情况:
SELECT m.movie_id FROM movies m JOIN rooms r ON m.room_id = r.room_id LEFT JOIN ( SELECT movie_id, COUNT(*) AS sold_tickets FROM tickets GROUP BY movie_id ) t ON m.movie_id = t.movie_id WHERE r.seats - COALESCE(t.sold_tickets, 0) > 0;
这种方法的优势是聚合操作只执行一次,在数据量较大时性能通常比子查询更优。
方法三:窗口函数(适用于支持窗口函数的数据库)
如果你的数据库支持窗口函数(如MySQL 8+、PostgreSQL、SQL Server等),可以用窗口函数直接计算每部电影的售票数,再筛选结果:
SELECT DISTINCT m.movie_id FROM movies m JOIN rooms r ON m.room_id = r.room_id LEFT JOIN tickets t ON m.movie_id = t.movie_id WHERE r.seats - COALESCE(COUNT(t.ticket_id) OVER (PARTITION BY m.movie_id), 0) > 0;
注:使用
DISTINCT是因为窗口函数会为每条售票记录重复计算同一电影的售票数,去重后得到唯一的电影ID。
关键注意点
一定要处理无售票记录的电影,否则这类电影会被错误排除——实际上它们的余座等于影厅总座位数,应该被包含在结果中。
内容的提问来源于stack exchange,提问作者user18921636
相关产品推荐
相关产品推荐

