内部联接从其他 table 获取两个具有 id 的名称列

Inner join get two name columns with id from other table

我有这个代码

SELECT
    home, away, teams.name as home_name, teams.abbreviation as home_abbr, teams.name as away_name, teams.abbreviation as away_abbr
FROM
    games
INNER JOIN
    teams ON games.home = teams.id
WHERE
    games.date >= '2022-01-01'

和这个结果

我有两个 table 的“游戏”和“团队”。在“游戏”table 中有主场和客场列。那里只写了id team。在“团队”table中有名称、缩写、图标等信息。我需要使用来自“teams”table 的联合查询来获取主场和客场球队的名称和缩写。在我的情况下,只获得一个(主场或客场)列信息

问题是您需要“查找”“游戏”中的两个团队值。这意味着您需要两个联接才能获得主场和客场的不同值。

假设

  • 游戏有 homeaway 个来自 teams table...
  • 的外键 ID
  • 每场比赛由两支球队组成,一支是“主场”,一支是“客场”

我们只是从比赛中加入两次,一次是“主队”数据,一次是“客队”数据。我们需要为每个加入别名“h”(家)“a”(离开) 然后更新字段以使用正确的别名。

给我们:

SELECT g.home, g.away, 
       h.name as home_name, h.abbreviation as home_abbr, 
       a.name as away_name, a.abbreviation as away_abbr
FROM games g
INNER JOIN teams h
  ON g.home = h.id
INNER JOIN teams a
  ON g.away = a.id
WHERE g.date >= '2022-01-01'

注: 为清楚起见,我为所有 3 个 table 和 select/join/where

中的每个字段设置了别名

未解决的问题 您说,“需要使用来自“teams”table 的联合查询来获取主队和客队的名称和缩写 table。”

为什么需要工会?这就是您认为可以让两支球队 names/abbreviations 的方式吗?如果是这样的话,这种方法对我来说没有意义,因为 Join 就足够了。除非你在不同的线路上寻找游戏的结果:你的示例输出没有显示。所以我认为联合是给出预期结果的错误方法。这并不是说不能用 union 和 max 以及 group by 来完成;但它比简单的连接工作更多,而且可能更慢。