MySQL技术问题:如何筛选观看过全部足球赛事的球迷(含重复购票)
找出观看过所有足球赛事的球迷解决方案
嘿,我来帮你搞定这个查询需求!咱们先理清楚核心问题:要筛选出看过所有赛事的球迷,还要注意同一个球迷可能为同一场比赛买多张票,统计的时候得去重,不能重复计数。
思路拆解
- 先算清楚数据库里总共有多少场不同的赛事(从
match表提取数据) - 对每个球迷,统计他们实际看过的不同赛事数量(从
booking表去重后统计,避免同一场票买多次算多场) - 把每个球迷的观赛场数和总场数对比,相等的就是我们要找的目标球迷
- 最后关联
fan表,把球迷的姓名信息一并拉出来
MySQL 查询代码
SELECT f.IDfan, f.name, f.surname FROM fan f JOIN ( -- 统计每个球迷去重后的观赛场数 SELECT IDfan, COUNT(DISTINCT IDmatch) AS watched_matches FROM booking GROUP BY IDfan ) b ON f.IDfan = b.IDfan -- 筛选出观赛场数等于总赛事数的球迷 WHERE b.watched_matches = (SELECT COUNT(*) FROM match);
代码解释
(SELECT COUNT(*) FROM match):这个子查询用来获取所有赛事的总数量,示例数据里是3场。- 内层子查询用
COUNT(DISTINCT IDmatch),就是为了避免同一个球迷买同一场的多张票导致统计场数虚高,确保只计算实际看过的不同赛事。 - 最后通过JOIN关联球迷表和统计结果,筛选出符合条件的记录即可。
测试结果
用你提供的示例数据运行这个查询,会得到预期的结果:
| IDfan | name | surname |
|---|---|---|
| 1 | A | A |
内容的提问来源于stack exchange,提问作者Andrea Massaro
相关产品推荐
相关产品推荐

