【问题标题】:2 inner joins to same data on other table [duplicate]2个内部连接到其他表上的相同数据[重复]
【发布时间】:2019-12-30 23:53:17
【问题描述】:

我对此的理解有点卡住了

我有 2 张桌子......“游戏”和“团队”

**teams**

teamID,teamName
1, Bears
2, Steelers
3, Giants
4, Bengals
...


**Games**

gameID,awayTeamID,homeTeamID
10, 1,2
20, 3,4

我正在尝试编写一个查询,我将在其中返回比赛,但也带回主队和客队的球队名称(或者甚至“代替”,因为我实际上不需要最终查询中的 ID)

我尝试了 INNER JOIN,如果我链接 .. 'games.homeTeamID=teams.teamID' 那么它将成功地将 teamID 带回我的查询中......但是,我需要对 'awayTeamID' 做同样的事情,所以我尝试了 2 个 INNER JOINS

SELECT * FROM games INNER JOIN teams on games.awayTeamID=teams.teamID  INNER JOIN teams on games.homeTeamID=teams.teamID 

但是当我尝试加入同一个项目两次时,我自然会得到一个 SQL 错误

#1066 - 不是唯一的表/别名:'teams

.. 我希望我的查询结果如下所示

gameID,awayTeamID,homeTeamID,awayTeamNAME,homeTeamNAME,
10, 1,2,Bears, Steelers
20, 3,4,Giants,Bengals

gameID,awayTeamNAME,homeTeamNAME,
10,Bears, Steelers
20,Giants,Bengals

...当然 awayTeamNAMEhomeTeamNAME 还不存在,所以这是一个问题 :-)

如果这是一个非常简单的问题,我们深表歉意,但有谁知道我如何为 2 个不同的结果对象引用团队表中的同一项目?

任何帮助将不胜感激

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    几个表别名应该可以解决您的问题。

    SELECT * 
    FROM games 
    INNER JOIN teams AS awayTeam
      on games.awayTeamID=awayTeam.teamID  
    INNER JOIN teams AS homeTeam
      on games.homeTeamID=homeTeam.teamID 
    

    【讨论】:

    • 谢谢 Eric ...谢谢,它确实带回了名称...但是,无论如何要更改列标题吗?它返回“teamName”作为两个返回项目的列标题。我将把它传递到 Jinja2 模板中,在该模板中我专门通过列标题名称引用值,例如 {{myQueryReturn.teamName}} ...如果两者它们是相同的,那么它就不会知道要引用哪一个..这可能你知道吗?
    • @gbt,那么您只需要在SELECT 列表中使用列别名,例如teamName AS homeTeamName.
    【解决方案2】:

    你需要一个表名的别名:

    SELECT *
    FROM games
    INNER JOIN teams -- ----------------+
    on games.awayTeamID=teams.teamID -- +------ Same table name, you can't tell how the join is applied
    INNER JOIN teams -- ----------------+
    on games.homeTeamID=teams.teamID
    

    将您的查询更改为此(请注意加入条件,games.awayTeamID=T1.teamID 和 games.homeTeamID=T2.teamID):

    SELECT T1.teamName AS AwayTeam,
           T2.teamName AS HomeTeam
    FROM games
    INNER JOIN teams T1 -- ----------------+
    on games.awayTeamID=T1.teamID --       +------ Tables are now aliased
    INNER JOIN teams T2 -- ----------------+
    on games.homeTeamID=T2.teamID
    

    【讨论】:

    • @gbt 他们的查询确实改变了结果的列标题。
    • 嗨 Cid ..是的,我的错误,一切正常 - 标记为答案 ....再次感谢
    【解决方案3】:

    试试这个:

    SELECT
      *
    FROM
      games, teams
    where
      games.awayTeamID = teams.teamID
      or games.homeTeamID = teams.teamID
    

    MySQL 8.0 Reference JOIN Syntax

    希望对你有所帮助

    【讨论】:

    • 到底是什么?您不能在未加入的 WHERE 子句中包含表。而你的 WHERE 子句,即使有一个到 teams 的连接,也需要 awayTeamIDhomeTeamID 是相同的 teams.teamID,这充其量是不太可能的。我没有反对,但你应该考虑把这个答案记下来,因为它是不正确的。
    • 修复。现在进行内部连接。
    • 从不发布 w3schools 链接作为参考,这是一个糟糕的参考。该网站有很多错误,与 W3C 无关。而是给官方文档(MySQL文档很不错)
    猜你喜欢
    • 1970-01-01
    • 2021-08-22
    • 1970-01-01
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    • 2013-04-19
    • 2019-05-30
    相关资源
    最近更新 更多