连接三个联结表

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

以上是关于连接三个联结表的主要内容,如果未能解决你的问题,请参考以下文章

使用 SQL 将表与联结表连接起来

Oracle 表连接方式

多个多对多关系(循环关系)

三个表之间的连接表的优缺点,在任何给定时间只有两个表

MySQL表联结

在联结表中插入值