我在这里已经阅读和学习了很多东西,到目前为止,没有提出任何要求就解决了很多问题,但是我无法应付这个问题。

我有三个表:

-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

10-04 14:16