【问题标题】:Joining table mysql -- without double iteration加入表 mysql -- 没有双重迭代
【发布时间】:2018-12-03 01:57:55
【问题描述】:

首先让我说这应该是一个相对简单的问题,这是由于糟糕的数据库设计(不是我)而变得不必要的复杂,说我也不是 mysql 专家。

考虑以下

餐桌安排

注意homeIDvisitorID包含团队名称而不是实际团队ID

为了解决这个问题,我创建了一个新表,其中包含 teamIDteamName 的列,如下图所示。

桌队

我的问题

我必须从 table Teams 获取主队和客队的 teamID

所以我创建了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

请注意上面的 teamID 如何只为 1 个团队生成Limit 1

无限制声明(双迭代)

请注意上面如何检索两个团队的 teamID。 问题是它进行了两次迭代。

TLDR;以上提出了以下问题

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

  2. 1234563 /p>

问题

如何通过一次迭代从表团队中获取 BOTH teamID?希望这有意义....

额外

带有硬编码团队名称的应用程序演示如下所示(只是为了了解他们想要实现的目标)

【问题讨论】:

    标签: php mysql sql database database-design


    【解决方案1】:

    听起来你想加入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】:

    我猜你想在一行而不是两行中显示两个团队。
    如果是,则需要加入表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 |
    

    但是,您也可以在 INNER 连接上考虑 LEFT 连接,这适用于 TEAMS 表中没有相关数据的情况:

    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');
    

    【讨论】:

    • 非常感谢。 Left Join 建议真的很棒。非常好的剧本!
    【解决方案3】:

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

    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 被替换teams 表中的子查询)。然后,您可以针对该视图进行查询 - 它们将像您在其中直接包含团队名称的原始表一样工作。

    【讨论】:

      猜你喜欢
      • 2022-11-25
      • 1970-01-01
      • 2018-04-29
      • 2010-11-14
      • 1970-01-01
      • 1970-01-01
      • 2018-11-17
      相关资源
      最近更新 更多