首页 > 解决方案 > 如果数据存在,则加入多个表

问题描述

我在泡菜里。

我创建了一个连接多个表的比赛计时系统。这工作正常。有一个 RFID 读数表(标签 ID 和时间)。标签 ID 与比赛号码匹配的表格和跑步者姓名与比赛号码的表格。这工作正常...

SELECT s.firstName
        , s.lastName
        , s.event
        , h.time
        , h.action
        , h.tagId
    FROM $runnerTable s
    INNER JOIN $chipData hp
        on s.raceNumber = hp.bandID
    LEFT JOIN $readingTable h
        on hp.tagId = h.tagId WHERE event = 'Full' ORDER BY  h.action, h.time ASC

我遇到的问题是我想添加一个新表,其中包含比赛中检查点的扫描读数。因此存在一个名为 readingsCheckpoint 的新表。问题是一些跑步者由于各种原因不会在检查站被扫描。我需要一个 JOIN 语句,如果值存在,则添加新的读数检查点数据,但如果该值不存在,则不从语句中返回 NULL。显然,在比赛期间很可能在完成时间之前存在检查点扫描(存在于读数表中)。

当前数据示例...

带有示例数据的读数表:

id, tagID, time, action
1,  12345, 1509, 1

带有示例数据的 Runners 表:

runnerId, raceNumber, firstName, lastName, event
1,      , 45        , Timothy  , Jones   , Full

芯片数据chipFiveTwice:

bandId, tagId
45    , 12345

以及与读数表相同的新检查点表:

id, tagID, checkTime, action
1,  12345, 1501 .   , 1

上面的当前 SQL 将产生如下结果:

firstName, lastName, event, raceNumber, time, action, tagId
Tim      , Jones   , Full , 45        , 1509, 1     , 12345

如您所见,它将 RFID 连接到赛车手并显示他们的姓名和时间。

如何将检查点扫描添加到此 SQL 语句以产生此结果?

firstName, lastName, event, raceNumber, time, checkTime, action, tagId
Tim      , Jones   , Full , 45        , 1509, 1501     , 1     , 12345

但是如果你是一个,它会显示一个时间和/或如果有一个,它会显示一个 checkTime。提前致谢。

标签: mysqlsql

解决方案


在@ spencer7593 的一些帮助和语句的 WHERE 部分的一些额外逻辑下,我设法解决了这个问题。

SELECT s.firstName
    , s.lastName
    , s.event
    , h.time
    , h.action
    , h.tagId
    , rc.checkTime
FROM runners s
INNER JOIN chipFiveTwice hp
    on s.raceNumber = hp.bandID
LEFT JOIN readings h on hp.tagId = h.tagId 
LEFT JOIN readingsCheckpoint rc ON rc.tagid = hp.tagid AND rc.checkTime IS NOT NULL
WHERE rc.checkTime IS NOT NULL OR h.time IS NOT NULL AND event = 'full'

推荐阅读