我有两个表,游戏和团队.我的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)
这样,可以适当地命名列,而不是使列t1和t2列共享相同的名称.
现在,解决关于什么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上),同时允许您从表中获取数据以进行内部比较.在尝试查找某些内容或相关行的顺序时,这非常有用.
无论如何,我希望这个非常漫无边际的答案可以帮助某个人.
| 归档时间: |
|
| 查看次数: |
5515 次 |
| 最近记录: |