2011-02-17 33 views
2

我有一個模式,它是設置爲這樣:如何結合複雜的數據

Cards   (card_id, fact_id, fact_view_id) 
data_for_fact (fact_id, key, value) 

的樣本數據:

[cards]: (51, 1, '2::1'), (52, 1, '2::2') ... 
    [data_for_fact]: (1, 'q', 'person'), (1, 'a', 'noun') 

預期的輸出結果是:

[cards]: (51, 'person' (as q), 'noun' (as a)), 
      (52, 'noun' (as q), 'person' (as a)) 

使用SQL精簡版,我如何獲得我正在尋找的輸出?

我試過創建一個連接,但只適用於第一個輸出卡。兩張牌的區別在於fact_view id。

+1

如何,到底,不`fact_view_id`確定了戀愛關係? – outis 2011-02-17 02:10:33

+0

它鏈接到另一個表,但對於這個例子'2 :: 1'是問題然後回答,而2 :: 2是答案,然後問題。對不起,我不得不編輯這個問題,因爲我注意到我沒有得到正確的列。 – monksy 2011-02-17 02:35:52

回答

1

你可以用工會做到這一點:

SELECT card_id, ques.value AS q, ans.value AS a 
    FROM cards 
    JOIN data_for_fact AS ques 
     ON cards.fact_id=ques.fact_id AND ques.key='q' 
    JOIN data_for_fact AS ans 
     ON cards.fact_id=ans.fact_id AND ans.key='a' 
    WHERE cards.fact_view_id='2::1' 
UNION ALL 
SELECT card_id, ans.value AS q, ques.value AS a 
    FROM cards 
    JOIN data_for_fact AS ans 
     ON cards.fact_id=ans.fact_id AND ans.key='a' 
    JOIN data_for_fact AS ques 
     ON cards.fact_id=ques.fact_id AND ques.key='q' 
    WHERE cards.fact_view_id='2::2' 

或者你可以使用CASE表達式:

SELECT card_id, 
     CASE cards.fact_view_id WHEN '2::1' THEN ques.value ELSE ans.value END AS q, 
     CASE cards.fact_view_id WHEN '2::1' THEN ans.value ELSE ques.value END AS a 
    FROM cards 
    JOIN data_for_fact AS ques 
     ON cards.fact_id=ques.fact_id AND ques.key='q' 
    JOIN data_for_fact AS ans 
     ON cards.fact_id=ans.fact_id AND ans.key='a'