2012-02-23 69 views
1

我已經閱讀並且在這裏學到了很多東西,得到了許多問題,但沒有問任何問題,但我無法應付這個問題。MySQL條件JOIN使用不同表中的鍵進行匹配

我有三個表:

-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是基於程序創建的.AuditID鍵現在已經過時。

我需要的是一個條件JOIN,以便當events.AuditID不爲空時,審計表將使用events.AuditID而不是programs.AuditID進行連接。

在此先感謝!

回答

0

我相信你應該使用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 
+0

給出了這樣的錯誤:SQLSTATE [42000]:語法錯誤或訪問衝突:在調用1582不正確的參數個數原生函數'ISNULL 這說它應該只有一個參數:[鏈接](http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_isnull) – 2012-02-23 22:24:59

+1

'ISNULL'可能想要成爲'IFNULL':http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#function_ifnull – biziclop 2012-02-23 22:41:10

+0

@biziclop謝謝你,先生......你是對的。在MySql和Sql Server之間切換會讓我的頭部爆炸... – 2012-02-23 22:48:16

相關問題