2012-08-29 53 views
0

我試圖解決這個問題。但我認爲我沒有得到任何地方。MySQL Query中的條件表更改

我有3個表:

這個故事包含了所有的問題和問題類型:

Table: Ref 
    id | type | info 
    ========================== 
    1   SS   Education 
    --------------------------- 
    2   RB   Gender 
    --------------------------- 
    3   ST   State 

此表包含 「選項」 在上表中的問題「Ref`

Table: ref_ans 
    id | q_id | answer_text 
    =========================== 
    1   1  Masters  
    --------------------------- 
    2   1  Bachelors  
    --------------------------- 
    3   1  Undergrad 
    --------------------------- 
    4   2  Male  
    --------------------------- 
    5   2  Female 
    --------------------------- 
    6   2  Dont want to disclose 

此表包含(在表Reftype = 「ST」)

狀態
Table: us_states 

    id | answer_text 
    =========================== 
    1  Alaska  
    --------------------------- 
    2  Alabama  
    --------------------------- 
    3  Arkansan 
    --------------------------- 
    4  Arizona  
    --------------------------- 
    5  Baltimore 
    --------------------------- 
    etc 

我想要的結果是:

ref.id, ref_ans.id, ref.answer_text/us_states.answer_text 

* 對於給定ref.question_id *

而條件是:如果question_id的答案是'ST',那麼應該從us_states得出答案,否則它應該從ref-ans表中拉出。

我試過了。顯然,這不起作用:

SELECT ref.id, 
     CASE WHEN ref.type = 'ST' THEN 
      (SELECT ID, answer_text FROM us_states) 
     ELSE 
      (SELECT id, answer_text FROM ref_ans) 
    END 

    FROM ref 
    WHERE ref.ID = <id> 

任何想法?

+2

如何'us_states.id'相關的其他表?我的意思是,'us_states.id'與'Ref.id'相同嗎? –

+0

不可以。在us_states中沒有提及ref.id –

回答

1

嘗試:

SELECT a.id, 
      COALESCE(b.id, c.id) AS ans_id, 
      COALESCE(b.answer_text, c.answer_text) AS answer_text 
FROM  ref a 
LEFT JOIN ref_ans b ON a.id = b.q_id 
LEFT JOIN us_states c ON a.type = 'ST' 
WHERE  a.id = <id> AND (
       (a.type <> 'ST' AND b.id IS NOT NULL) OR 
       (a.type = 'ST' AND c.id IS NOT NULL) 
     ) 
+0

我必須給你+100 :-)。有一個小故障。即使對於特定問題ID,B上沒有記錄,它也會顯示一個空值的記錄。所以我在第一次加入時添加了「不爲空」,現在它全部運行。非常感謝! –

+0

@KevinRave,我很關心你的修改。你***需要***如果問題是一個「ST」問題,則第一個連接爲NULL,以便COALESCE可以使用NULL值跳過到us_states表中的答案。我想你想過濾出的問題根本沒有任何答案。我會修改我的解決方案來解決這個問題。 –

+0

是的,我只是不希望null爲非現有的答案。但不知道,當我嘗試在連接中使用NOT NULL時,它似乎工作。不過,我會嘗試編輯。 –

0

假設全部三個表是由ID(第1列)連接:

SELECT ref_ans.id, ref.id, if(ref.type='ST', us_states.answer_text, ref_ans.answer_text) as answer_text 
    FROM ref_ans 
    JOIN ref on ref.id=ref_ans.id 
    JOIN us_states on ref.id=us_states.id 
    WHERE ref_ans.q_id = <id> 
+0

並非所有我想要的列在你的答案中都是正確的。 –