mysql - 如何连接多个表,包括查找表并按行返回数据

标签 mysql sql pivot-table lookup-tables jointable

我正在尝试显示一些简单的电脑游戏结果,并使在我的代码中逐行迭代结果变得容易。我想要它,以便每场比赛的所有相关数据都在每条记录中,这样我就可以在一行上输出所有数据,例如:

  • A 队(得分45)与B 队(得分55),比赛时长:< strong>5 分钟
  • C 队(得分60)与D 队(得分65),比赛时长:< strong>4.3 分钟

所以对于一场比赛,有两支球队互相比赛,他们在比赛结束时各自得到一个分数。基本上每场比赛在 games_teams 表中最终都会有两行。

这是我的架构:

schema pic

这是我的表格数据:

table data pic

这是我试图实现的输出,因此我可以轻松地遍历结果并将它们输出到页面上:

desired output pic

我设法通过一些可怕的 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 表中提取其他游戏统计数据,这样子查询就会更多。

我试过的另一种方法是:

not desired output pic

我使用以下 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 - 如何连接多个表,包括查找表并按行返回数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10862201/

相关文章:

sql - 需要帮助编写 SQL 以在结帐时将促销应用到购物篮

SQL获取不在列表中的项目

excel - Java 开源库从 excel 中生成数据透视表

excel - 引用整个数据透视表的公式?

excel - 按 bool 值过滤数据透视表

php - MySQL Select 数据分隔字符串

mysql - 奖品表的数据库建模,允许根据比赛进行定制

MySQL --- 跨多个元组满足条件的 SELECT 查询

mysql - 在出现逗号时向现有 SQL 字符串添加附加内容

sql - dbvisualizer:在选择查询中设置最大行数