mysql – 如何连接多个表,包括查找表和返回行中的数据
作者:互联网
我正在尝试显示一些简单的计算机游戏结果,并且可以轻松地在我的代码中逐行迭代结果.我想要它,以便每个游戏的所有相关数据都在每个记录中,所以我可以在一行输出所有数据,例如:
> A队(得分45)对阵B队(得分55),比赛持续时间:5分钟
> C队(得分60)对阵D队(得分65),比赛持续时间:4.3分钟
因此,对于一个游戏,有两个团队相互比赛,每个团队在游戏结束时都得到一个分数.基本上,每个游戏最终在games_teams表中有两行.
这是我的架构:
这是我的表格数据:
这是我想要实现的输出,所以我可以轻松地遍历结果并在页面上输出它们:
我设法通过一些可怕的SQL和许多子查询来实现这一点:
SELECT games.game_id, game_name, game_duration,
(SELECT team_id FROM games_teams WHERE games.game_id = games_teams.game_id LIMIT 0, 1) AS team_id_a,
(SELECT team_id FROM games_teams WHERE games.game_id = games_teams.game_id LIMIT 1, 1) AS team_id_b,
(SELECT teams.team_name FROM games_teams INNER JOIN teams ON games_teams.team_id = teams.team_id WHERE games.game_id = game_id LIMIT 0, 1) AS team_name_a,
(SELECT teams.team_name FROM games_teams INNER JOIN teams ON games_teams.team_id = teams.team_id WHERE games.game_id = game_id LIMIT 1, 1) AS team_name_b,
(SELECT team_score FROM games_teams WHERE games.game_id = games_teams.game_id LIMIT 0, 1) AS team_score_a,
(SELECT team_score FROM games_teams WHERE games.game_id = games_teams.game_id LIMIT 1, 1) AS team_score_b
FROM games
这种方法的问题是它会很慢而且不能扩展.我还需要从games_teams表中提取其他游戏统计数据,以便更多的子查询.
我尝试的另一种方法是:
我通过以下SQL实现了这一点:
SELECT games.game_id, game_name, game_duration, teams.team_id, team_name, team_score
FROM games
INNER JOIN games_teams ON games.game_id = games_teams.game_id
INNER JOIN teams ON games_teams.team_id = teams.team_id
现在,由于每个游戏的相关数据在两个不同的记录中,因此在代码中这种方式将更难以预测.我必须构建行的第一部分,然后进入下一个循环迭代并打印下一部分.然后在下一场比赛中重新开始,我试图在一行上显示所有信息,如:
A队(得分45)对阵B队(得分55),比赛持续时间:5分钟
所以这就是为什么我认为如果它只是在一条记录上会更容易.有没有办法很好地完成这个,所以如果我需要在games_teams表中有更多的列,它也可以扩展吗?
如果需要重新创建,请使用数据库代码Here’s a pastebin link.
任何帮助非常感谢,谢谢!
解决方法:
您需要两次加入games_teams和团队,例如:
SELECT ga.game_id
, ga.game_name
, ga.game_duration
, t1.team_name, gt1.team_score
, t2.team_name, gt2.team_score
FROM games ga
JOIN games_teams gt1 ON gt1.game_id = ga.game_id
JOIN games_teams gt2 ON gt2.game_id = ga.game_id
JOIN teams t1 ON t1.team_id = gt1.team_id
JOIN teams t2 ON t2.team_id = gt2.team_id
WHERE gt1.team_id < gt2.team_id
;
一个干净的方法来挤出{games_teams * teams}子连接并引用它两次是将它放入CTE :(不幸的是mysql不支持CTE)
WITH gtx AS (
SELECT gt.game_id
, gt.team_score
, te.team_id
, te.team_name
FROM games_teams gt
JOIN teams te ON te.team_id = gt.team_id
)
SELECT ga.game_id
, ga.game_name
, ga.game_duration
, g1.team_name, g1.team_score
, g2.team_name, g2.team_score
FROM games ga
JOIN gtx g1 ON g1.game_id = ga.game_id
JOIN gtx g2 ON g2.game_id = ga.game_id
WHERE g1.team_id < g2.team_id
;
结果:
game_id | game_name | game_duration | team_name | team_score | team_name | team_score
---------+-----------+---------------+-----------+------------+-----------+------------
1 | Game A | 300 | Team A | 45 | Team B | 55
2 | Game B | 258 | Team C | 60 | Team D | 65
(2 rows)
标签:mysql,sql,pivot-table,lookup-tables,jointable 来源: https://codeday.me/bug/20190620/1249482.html