我在这里已经阅读和学习了很多东西,到目前为止,没有提出任何要求就解决了很多问题,但是我无法应付这个问题。
我有三个表:
-programs
->ProgramID (Primary Unique)
->ProgramName
->AuditID
-audits
->AuditID (Primary Unique)
->VenueName
->Address
-events
->EventID (Primary Unique)
->EventDate
->ProgramID
->AuditID
活动是当天正在播放的那些程序的实例。一个程序的多个实例可能会在一天中执行,如果没有播放,则不会执行。这基本上是一个临时表,每天都在填充。可以从当天播放的节目中购买门票。
审计是演出的实际阶段。剧院可以分为几个阶段。
节目是为他们的剧目保留多年的戏剧。执行该程序的最后阶段被存储,以便当有人检索到在该天的实际日期仍未播放的节目的信息时,仍然可以链接该阶段。
我现在正在使用此查询:
SELECT
programs.ProgramID,
programs.ProgramName,
programs.AuditID,
events.EventID,
events.EventDate,
audits.VenueName,
audits.Address
FROM programs
LEFT JOIN events
ON programs.ProgramID = events.ProgramID
JOIN audits
ON programs.AuditID = audits.AuditID
WHERE programs.ProgramID = :ProgramID
如果没有该程序的事件,则LEFT JOIN会向我提供有关该程序和审核的信息,而将事件信息留空。好。
如果活动与上次播放的地方相同,也可以。大。
问题在于它是否在其他审计中播放,因为审计表的JOIN是基于program.AuditID密钥创建的,现在已经过时了。
我需要有条件的JOIN,以便当events.AuditID不为null时,将使用events.AuditID而不是program.AuditID来连接审计表。
提前致谢!
最佳答案
我相信您应该能够使用JOIN
IFNULL(events.AuditID, programs.AuditID)
解决此问题...
SELECT
programs.ProgramID,
programs.ProgramName,
programs.AuditID,
events.EventID,
events.EventDate,
audits.VenueName,
audits.Address
FROM programs
LEFT JOIN events
ON programs.ProgramID = events.ProgramID
JOIN audits
ON IFNULL(events.AuditID, programs.AuditID) = audits.AuditID
WHERE programs.ProgramID = :ProgramID