MySQL条件JOIN使用来自不同表的键进行匹配

时间:2012-02-23 22:04:37

标签: mysql join conditional

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

我有三张桌子:

-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是基于programs.AuditID密钥进行的,现在已经过时了。

我需要的是条件JOIN,因此当events.AuditID不为null时,审计表将使用events.AuditID而不是programs.AuditID加入。

提前致谢!

1 个答案:

答案 0 :(得分:0)

我相信你应该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