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

如何将售票数统计结果用于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 12:15:49