如果有数据,则联接多个表

时间:2020-03-03 17:55:34

标签: mysql sql

我在泡菜中。

我创建了一个比赛计时系统,可以联接多个表。这工作正常。有一个用于读取RFID的表格(标签ID和时间)。标签ID的表格与比赛编号相匹配,而运动员姓名的表格与比赛编号相匹配。效果很好...

df.stack().reset_index(level=0, drop=True).sort_index()

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

当前数据示例...

带有示例数据的读数表:

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

带有示例数据的跑步者表:

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

chip data chipFiveTwice:

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

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

bandId, tagId
45    , 12345

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

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

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

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

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

但是要显示一个时间(如果您是一个)和/或一个checkTime(如果一个)。预先感谢。

1 个答案:

答案 0 :(得分:0)

我已经通过@ 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'