如何获取曾效力过Zach所有球队的球员ID与姓名?
需求描述
我在MySQL数据库中有以下三张表:
team表
team_id name 3 Rangers 12 Capitals 19 Red Wings 4 Bruins 212 Avalanche 102 Flyers 20 Islanders 50 Sabres 7 Stars
player表
id name 2 Zach 1 Deb 17 William 9 Viktor 12 Andrew 41 Chris 22 Bobby 5 Phil 3 Roy 92 Li 6 Juan
players_in表
team_id player_id points 3 2 42 212 2 19 3 12 18 19 12 2 3 41 2 4 41 1 212 41 78 212 17 1 19 41 4 12 41 2 3 17 6 4 1 9 102 1 40 102 22 7 20 22 19 20 5 22 50 3 20 12 92 15 12 17 8 7 6 12
我需要获取曾效力过Zach所有球队的球员的name和id。已知Zach效力过Rangers(team_id=3)和Avalanche(team_id=212),期望结果如下:
name id William 17 Chris 41
解决方案
可以通过以下SQL语句实现需求:
SELECT p.name, p.id FROM player p JOIN players_in pi ON p.id = pi.player_id WHERE pi.team_id IN ( SELECT team_id FROM players_in WHERE player_id = (SELECT id FROM player WHERE name = 'Zach') ) GROUP BY p.id, p.name HAVING COUNT(DISTINCT pi.team_id) = ( SELECT COUNT(DISTINCT team_id) FROM players_in WHERE player_id = (SELECT id FROM player WHERE name = 'Zach') ) AND p.id != (SELECT id FROM player WHERE name = 'Zach');
逻辑说明:
- 通过子查询先获取Zach的
player_id,再提取他所有效力过的team_id集合; - 关联
player和players_in表,筛选出所有曾在这些球队效力过的球员; - 按球员分组后,统计每个球员在Zach的球队中效力过的不同球队数量,只有当该数量等于Zach总共效力的球队数时,才说明该球员覆盖了Zach的所有球队;
- 最后排除Zach本人,得到目标结果。
内容的提问来源于stack exchange,提问作者equanimity
相关产品推荐
相关产品推荐

