连接三个联结表
Posted
技术标签:
【中文标题】连接三个联结表【英文标题】:Joining three junction tables 【发布时间】:2021-01-26 23:27:48 【问题描述】:试图弄清楚这一点让我头疼!
我有三张桌子 -玩家 -团队 -游戏
具有两列的三个联结表。 -player_teams -teams_games -player_games
我需要列出所有未分配团队(在此游戏中)的游戏中的玩家(例如:变量中的 Game_id = 111)。我称他们为孤儿玩家
基本上得到在比赛中的球队,得到他们的球员并与 Games_players 反向比赛。或者我想反过来。
我试了两天没有运气!
谢谢!
/J p.s 在我发布此内容后,我已经走到了这一步,但它似乎很复杂!
SELECT * from players
JOIN
(SELECT DISTINCT games_players.player_id from games_players
Left JOIN
(Select team_players.player_id p1 from team_players
inner join (Select * from games_teams where games_teams.game_id = :P1) AS tm1 ON team_players.team_id = tm1.team_id) As f1
On games_players.player_id = f1.p1
where p1 is null) as q1
on players.player_id = q1.player_id
【问题讨论】:
请表定义、示例输入和预期输出。您可能想要类似NOT EXISTS
查询(您的实际数据库设计存在问题,我相信您已经理解。player_games
表可能实际上不应该存在)
玩家注册玩游戏,支付费用,然后被分配一个团队。他们可以打很多场比赛,每次都在不同的球队。有什么建议么?实际上我认为我解决了它,但并不漂亮
我认为您的主要问题是您试图通过连接来解决这个问题。改用[NOT] EXISTS
或[NOT] IN
,任务变得容易得多。
那么如果玩家可以在逻辑上被分配到没有团队的游戏中,那么team_players
可能应该指代player_games
,以便所有连队玩家实际上都在其中游戏
谢谢!我会调查的
【参考方案1】:
由于给出了比赛,你可以只看比赛中的球员和比赛中球队的球员:
select *
from players
where player_id in
(
select player_id
from player_games
where game_id = 111
)
and player_id not in
(
select pt.player_id
from player_teams pt
join teams_games tg using (team_id)
where tg.game_id = 111
);
【讨论】:
哇哇!!!如此优雅!我学到了很多东西!效果很好! @kattouf 小心NOT IN
查询,它们在存在可空列时表现得很奇怪。不过,您可以轻松地将其转换为 [NOT] EXISTS
以上是关于连接三个联结表的主要内容,如果未能解决你的问题,请参考以下文章