mysql - 如果数据存在,则加入多个表
问题描述
我在泡菜里。
我创建了一个连接多个表的比赛计时系统。这工作正常。有一个 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。提前致谢。
解决方案
在@ 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'