SQL - 将2个外键连接到1个主键

4 mysql sql

我有两个表,游戏和团队.我的sql语句应该如何制作一个链接到TeamID1和TeamID2字段的TeamName的游戏列表?我相信我可以使用左连接,但我不知道如何处理链接到一个主键的两个外键.非常感谢您提供的任何帮助.

游戏

GameID
TeamID1
TeamID2
结果

小组

TeamID
TeamName

Eri*_*ric 15

我经常看到人们在同一个查询中加入一个表或多次加入表的想法(就像在这里一样).一旦掌握,对于在行之间有很多关系的表(例如必须互相玩的团队列表!),这是一种很好的技术.正如其他人指出的那样,你需要用两个inner join来完成这个:

select
    *
from
    games g
    inner join teams t1 on
        g.teamid1 = t1.teamid
    inner join teams t2 on
        g.teamid2 = t2.teamid
Run Code Online (Sandbox Code Playgroud)

所以,如果你的games表看起来像这样:

GameID    TeamID1    TeamID2
----------------------------
     1          1          3
     2          4          2
     3          2          1
Run Code Online (Sandbox Code Playgroud)

您将获得以下结果集:

g.GameID    g.TeamID1    g.TeamID2    t1.TeamID    t1.Name    t2.TeamID    t2.Name
----------------------------------------------------------------------------------
       1            1            3            1    Lions              3    Bears
       2            4            2            4    Oh My              2    Tigers
       3            2            1            2    Tigers             1    Lions
Run Code Online (Sandbox Code Playgroud)

当然select,出于可用性的考虑,如果我是我,我会在声明中为这些列添加别名:

select
    g.GameID,
    t1.Name as Team1,
    t2.Name as Team2
from
    ...
Run Code Online (Sandbox Code Playgroud)

这样,可以适当地命名列,而不是使列t1t2列共享相同的名称.

现在,解决关于什么left join是混乱的困惑.你会看到,a left join将从第一个(或左)表中获取所有行,然后将连接条件中的所有行与第二个(或右)表匹配.对于左表中的任何行,您将获得表null中的所有列right.

深入研究一个例子,让我们说有人因为某种原因在其中一行上放了一个nullfor TeamID2.让我们也说一个TeamID4人的团队过去存在,但现在不再存在了.

GameID    TeamID1    TeamID2
----------------------------
     1          1          3
     2          4          2
     3          1       null
Run Code Online (Sandbox Code Playgroud)

现在,让我们来看看left join查询的内容:

select
    *
from
    games g
    left join teams t1 on
        g.teamid1 = t1.teamid
    left join teams t2 on
        g.teamid2 = t2.teamid
Run Code Online (Sandbox Code Playgroud)

从逻辑上讲,这将抓住我们所有的games,然后将它们匹配到相应的teams.但是,如果a TeamID不存在,我们就会得到nulls.它看起来像这样:

g.GameID    g.TeamID1    g.TeamID2    t1.TeamID    t1.Name    t2.TeamID    t2.Name
----------------------------------------------------------------------------------
       1            1            3            1    Lions              3    Bears
       2            4            2         null    null               2    Tigers
       3            1         null            1    Lions           null    null
Run Code Online (Sandbox Code Playgroud)

因此,left join如果一支球队是可选的需要.

在您的情况下,您将使用inner join多次连接表.这是一种非常常见的做法,非常有用.它避免了子查询的一些缺陷(特别是在MySQL上),同时允许您从表中获取数据以进行内部比较.在尝试查找某些内容或相关行的顺序时,这非常有用.

无论如何,我希望这个非常漫无边际的答案可以帮助某个人.

  • 它不是自己加入桌子; 它将游戏桌加入团队表两次 - 这是不同的(即使团队被提到两次). (3认同)