【问题标题】: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,以便所有连队玩家实际上都在其中游戏
  • 谢谢!我会调查的

标签: mysql sql junction-table


【解决方案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
猜你喜欢
  • 2011-08-27
  • 2021-09-28
  • 1970-01-01
  • 2015-04-11
  • 2016-12-20
  • 1970-01-01
  • 2018-11-06
  • 2014-02-24
  • 1970-01-01
相关资源
最近更新 更多