【问题标题】:SQL join for multiple columns with ids具有 id 的多列的 SQL 连接
【发布时间】:2018-09-08 03:23:22
【问题描述】:

我有两个 SQL 表。第一个表存储了运动员列表及其 id 和姓名。例如:

athlete_id | first_name | last_name
-----------|------------|----------
1          | Matthew    | Reese
2          | Tiffanie   | Renz
3          | Tom        | Dow

等等……

第二个表存储赛道(短跑)项目的条目,以及在每个车道上竞争的运动员的 ID。例如:

event_id | lane1_athlete_id | lane2_athlete_id | lane3_athlete_id  
---------|------------------|------------------|-----------------
1        | 1                | 15               | 24
2        | 18               | 2                | 4
3        | 78               | 50               | 3

等等……

我需要创建一个 SQL 查询,该查询将返回第二个表,但将运动员 ID 解析为运动员姓名。例如:

event_id | lane1_athlete | lane2_athlete | lane3_athlete  
---------|---------------|---------------|--------------
1        | Matthew Reese | Lesa Allain   | Nicole Spiers
2        | Emmy Bartol   | Tiffanie Renz | Louise Baier
3        | Zack Bui      | Norah Flagg   | Tom Dow

我想这涉及表连接,但我无法理解正确的查询。任何帮助将不胜感激。

【问题讨论】:

  • 虽然您在下面有一个很好的解决方案,但我可能建议将您的数据库更改为 3 个表而不是 2 个 - 运动员、事件和 eventathletes(可能包含一个 laneid 列的 1-many 表)。这样您就不必在每次引入新通道时添加更多列。您的问题的解决方案会有所不同,但我相信这将是更规范的方法。

标签: mysql sql join


【解决方案1】:

将第二个表加入第一个表,三次:

SELECT
    e.event_id,
    CONCAT(a1.first_name, ' ', a1.last_name) AS lane1_athlete,
    CONCAT(a2.first_name, ' ', a2.last_name) AS lane2_athlete,
    CONCAT(a3.first_name, ' ', a3.last_name) AS lane3_athlete
FROM events e
LEFT JOIN athletes a1
    ON e.lane1_athlete_id = a1.athlete_id
LEFT JOIN athletes a2
    ON e.lane2_athlete_id = a2.athlete_id
LEFT JOIN athletes a3
    ON e.lane3_athlete_id = a3.athlete_id;

【讨论】:

  • 在这种情况下,左外连接比内连接更安全,因为无效的运动员 ID 会导致您的行因内连接而消失。
  • @ChrisReynolds 实际上,如果表格设计得当,带有外键和主键,那么甚至不可能在事件表中引用不存在的运动员。但是为了承认你的观点,我添加了左连接。
  • 非常感谢!我不确定是否需要重复连接,但似乎是这样。
猜你喜欢
  • 2014-03-09
  • 2016-05-12
  • 1970-01-01
  • 2021-07-08
  • 2019-04-11
  • 1970-01-01
  • 2023-04-11
  • 2018-12-26
  • 1970-01-01
相关资源
最近更新 更多