代码之家  ›  专栏  ›  技术社区  ›  Timothy Coetzee

联接表mysql-不重复

  •  3
  • Timothy Coetzee  · 技术社区  · 7 年前

    首先让我说,这应该是一个相对简单的问题,因为糟糕的数据库设计(不是我的设计)使得这个问题变得不必要复杂,因为我也不擅长mysql。

    考虑一下

    表时间表

    enter image description here

    注意这些列 homeID visitorID 包含团队的名称,而不是实际的团队ID

    为了解决这个问题,我创建了一个包含列的新表。 teamID 以及 teamName 如下图所示。

    桌上小组

    enter image description here

    我的问题

    我必须从 table Teams 无论主队还是客队

    所以我创造了 Teams 表和这个简单的脚本:

    SELECT schedule.*, teams.* FROM schedule JOIN teams ON schedule.homeID = teams.teamName OR schedule.visitorID = teams.teamName WHERE schedule.gameID = 411 LIMIT 1 #added Limit1 else the code generates to rows

    mysql脚本输出

    限制1

    enter image description here

    注意上面teamid是如何 仅为一个团队生成 具有 Limit 1

    无限制语句(双迭代)

    enter image description here

    请注意上面如何为两个团队检索teamid。 问题是它做了两次迭代。

    tldr;上面显示了以下问题

    1. 首先,脚本将生成两个输出,一个用于主队,一个用于客队。正如所料,但我不能有。

    2. 作为对问题1的解决方法--我添加了 限制1 我遇到的问题 Limit 但它只会给你一个 团队ID (我想是意料之中的事)

    问题

    如何从具有单个迭代的表团队中获取两个teamid?希望这有意义…

    额外的

    带有硬编码团队名称的应用程序演示如下所示(只是为了说明他们正在努力实现的目标)

    enter image description here

    3 回复  |  直到 7 年前
        1
  •  2
  •   sticky bit    7 年前

    听起来你想加入 teams 两次到 schedule 是的。

    SELECT s.*,
           th.*,
           ta.*
           FROM schedule s
                INNER JOIN teams th
                           ON s.homeid = th.teamname
                INNER JOIN teams ta
                           ON s.visitorid = ta.teamname 
           WHERE s.gameid = 411;
    
        2
  •  2
  •   krokodilko    7 年前

    我想你想让两个队排成一排而不是两排。
    如果是,那么你需要加入这个表格 teams 两次。

    考虑一下这个演示: http://www.sqlfiddle.com/#!9/bb5e61/1

    此联接将把两个组集合为一行:

    SELECT s.*,
           t1.teamId as homeId_teamId,
           t1.teamCode as homeId_teamCode,
           t1.teamName as homeId_teamName,
           t2.teamId as visitorId_teamId,
           t2.teamCode as visitorId_teamCode,
           t2.teamName as visitorId_teamName      
    FROM Schedule s
    JOIN Teams t1 ON s.homeId = t1.teamName
    JOIN Teams t2 ON s.visitorId = t2.teamName;
    
    | id | homeId | visitorId | homeId_teamId | homeId_teamCode | homeId_teamName | visitorId_teamId | visitorId_teamCode | visitorId_teamName |
    |----|--------|-----------|---------------|-----------------|-----------------|------------------|--------------------|--------------------|
    |  1 | Poland |  Colombia |             1 |              PL |          Poland |                2 |                 CO |           Colombia |
    

    但是,您也可以考虑左连接,而不考虑内部联接,这将在团队表中没有相关数据的情况下工作:

    SELECT s.*,
           t1.teamId as homeId_teamId,
           t1.teamCode as homeId_teamCode,
           t1.teamName as homeId_teamName,
           t2.teamId as visitorId_teamId,
           t2.teamCode as visitorId_teamCode,
           t2.teamName as visitorId_teamName      
    FROM Schedule s
    LEFT JOIN Teams t1 ON s.homeId = t1.teamName
    LEFT JOIN Teams t2 ON s.visitorId = t2.teamName;
    
    | id |   homeId | visitorId | homeId_teamId | homeId_teamCode | homeId_teamName | visitorId_teamId | visitorId_teamCode | visitorId_teamName |
    |----|----------|-----------|---------------|-----------------|-----------------|------------------|--------------------|--------------------|
    |  1 |   Poland |  Colombia |             1 |              PL |          Poland |                2 |                 CO |           Colombia |
    |  3 | Ya Majka |    Poland |        (null) |          (null) |          (null) |                1 |                 PL |             Poland |
    |  2 | Ya Majka |   Rossija |        (null) |          (null) |          (null) |           (null) |             (null) |             (null) |
    

    下面是构成示例表的脚本

    CREATE TABLE Schedule(
      id int,   homeId varchar(20),visitorId varchar(20)
    );
    
    INSERT INTO Schedule VALUES
    (1, 'Poland', 'Colombia' ),(2,'Ya Majka','Rossija'), 
    (3,'Ya Majka','Poland');
    
    CREATE TABLE Teams( 
      teamId int, teamCode varchar(10), teamName varchar(20)
    );
    
    INSERT INTO Teams VALUES
    (1, 'PL', 'Poland' ),(2,'CO','Colombia'),(3,'US','United States');
    
        3
  •  2
  •   Leo K    7 年前

    您可以使用子查询(其中两个在同一查询中)来解决这个问题:

    select
      gameID, 
      weekNum,
      gameTimeEastern,
      (select teamName from teams where teamID = schedule.homeID) as homeName,
      homeScore,
      (select teamName from teams where teamID = schedule.visitorID) as visitorName,
      visitorScore from schedule;
    

    不是所有的列都来自 schedule ,只是一个演示其工作原理的示例。如果需要各种查询(包括 select * ,尽管除了测试之外,这不是一个好的实践,但是您可以基于上面这样的查询创建一个视图(除了homeid和visitorid之外,schedule中的所有列都被来自 teams 表)。然后,您可以针对该视图放置查询,它们将像原来的表一样工作,直接在其中包含团队名称。