数据库
首页 > 数据库> > mysql – 如何连接多个表,包括查找表和返回行中的数据

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