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

标签 mysql join conditional-statements

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

我有三个表:

-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 key 进行的,现在已经过时了。

我需要的是条件 JOIN,这样当 events.AuditID 不为 null 时,使用 events.AuditID 而不是 programs.AuditID 来连接审计表。

提前致谢!

最佳答案

我相信您应该能够使用 IFNULL(events.AuditID, programs.AuditID) JOIN 来解决这个问题...

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

关于MySQL conditional JOIN 使用来自不同表的键进行匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9422098/

相关文章:

c# - 为什么 string.Join ("", new object[] { null, "a", null, "b"}) 返回 string.Empty?

mysql - 外连接一张包含选择查询结果的表

python - 在 Python 中,我可以在一个条件中处理两个变量吗?

mysql - 搜索 2 列的上下文 MySQL 结果

php - 使用 2 个表和 3 个日期字段连接按降序获取多个日期的问题

php - 变量不存在时隐藏内容

python - Django:按多对多模型的日期时间和模型本身的日期时间排序

sql - LEFT OUTER JOIN(给出额外的行)问题

javascript - 为什么这个CSS类条件在react js中不起作用?

php - 通过php连接到mysql的最佳方法