连接表mysql-无需双重迭代

0ejtzxu1  于 2021-06-21  发布在  Mysql
关注(0)|答案(3)|浏览(314)

让我先说这应该是一个相对简单的问题,因为糟糕的数据库设计(不是我)使得这个问题变得不必要和复杂。
考虑以下几点
表格明细表

请注意列 homeID 以及 visitorID 包含团队的名称,而不是实际的teamid
为了解决这个问题,我创建了一个包含 teamID 以及 teamName 如下图所示。
桌上团队

我的问题
我必须从他那里拿到队号 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

请注意上面的teamid是如何只为1个具有 Limit 1 无限制语句(双重迭代)

注意上面的teamid如何为两个团队检索。问题是它在做双重迭代。
tldr公司;以上提出了以下问题
首先,脚本将生成两个输出,一个用于主队,一个用于客队。正如所料,但我不能有。
作为第1个问题的解决方法--我补充说 Limit 1 我遇到的问题 Limit 虽然它只会回馈一个 teamID (我想这是意料之中的)
问题
如何通过一次迭代从表团队获得两个teamid?希望这有意义。。。。
额外的
带有硬编码团队名称的应用程序演示如下所示(只是为了让您了解他们想要实现的目标)

uwopmtnx

uwopmtnx1#

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

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 * ,尽管这不是一个好的实践(除了测试),但是您可以基于上面的查询创建一个视图(使用schedule中的所有列,除了homeid和visitorid之外,这些列将被schedule中的子查询替换) teams 表)。然后,您可以对该视图放置查询—它们的工作方式将类似于您在其中直接包含团队名称的原始表。

kx1ctssn

kx1ctssn2#

听起来你想加入 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;
tquggr8v

tquggr8v3#

我猜你想把两个队都放在一排而不是两排。
如果是,则需要加入表 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 |

但是,您也可以在内部联接上考虑左联接,这将在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');

相关问题