2014-04-16 26 views
1

我有這樣的表:案例或者如果在MySQL查詢

時間表

id data_id pattern 
1  1  add_card 
2  1  add_post 
3  2  upd_card 
4  2  upd_post 

id name  parent 
1 cname1   1 
2 cname2   4 
3 cname3   5 

​​

我需要形式的結果

**結果時間表**

id data_id pattern  name  parent 
1  1  add_card cname1  1 
2  1  add_post pname1  8 
3  2  upd_card cname2  4 
4  2  upd_post pname2  9 

我只IF或CASE語句

SELECT id, data_id, pattern 
     (CASE parent 
     WHEN ‘add_card’ THEN (SELECT name.card,parent.card FROM card WHERE data_id.timeline = id.card) 
     WHEN ‘add_card’ THEN (SELECT name.post,parent.post FROM post WHERE data_id.timeline = id.post) 
     END) 
FROM timeline 

的想法,但是這是不正確的語法,這只是我的猜猜它會是什麼樣子!

回答

3

使用LEFT OUTER JOIN s到有選擇地在卡或交表連接和COALESCE獲得所產生的父/名稱信息在一列:

SELECT timeline.id, timeline.data_id, timeline.pattern, 
    COALESCE (post.name, card.name) AS name, 
    COALESCE (post.parent, card.parent) AS parent 
FROM timeline 
LEFT OUTER JOIN card ON timeline.data_id = card.id 
    AND timeline.pattern IN ('add_card', 'upd_card') 
LEFT OUTER JOIN post ON timeline.data_id = post.id 
    AND timeline.pattern IN ('add_post', 'upd_post') 

您可以在這裏看到的結果:http://sqlfiddle.com/#!2/76d8cb/1/0

結果不符合您的示例結果,BU你的示例結果似乎與你的數據不一致,所以我認爲這是你的意思。 (更新:我已經編輯了您的示例結果,以與示例表格保持一致。)

+0

是的!那它。非常感謝 –

+1

+1。用JOIN解決方案。性能也很好。在[* SQL小提琴*](http://sqlfiddle.com/#!2/a568c/3) –

+0

@tgies測試,並且有一刻,如何在父母http://sqlfiddle.com/的另一張桌面上查找姓名#!2/24f3b/6 –

-1

您似乎在檢查相同的值並執行2個不同的操作。

不過,我想你大概想是這樣的: -

SELECT timeline.id, timeline.data_id, timeline.pattern 
    CASE 
     WHEN timeline.pattern = 'add_card' THEN card.name 
     WHEN timeline.pattern = 'add_card' THEN post.name 
     ELSE NULL 
    END, 
    CASE 
     WHEN timeline.pattern = 'add_card' THEN card.parent 
     WHEN timeline.pattern = 'add_card' THEN post.parent 
     ELSE NULL 
    END 
FROM timeline 
LEFT OUTER JOIN card timeline.data_id = card.id 
LEFT OUTER JOIN post timeline.data_id = post.id 
+0

您不需要'CASE's;你可以製作timeline.pattern部分的連接條件。 – tgies

+0

這不起作用;在字段列表中使用'CASE'似乎並不支持。你也在說'timeline.parent',你的意思是'timeline.pattern';我會編輯它。 – tgies

+0

@tgies - 您可以在字段列表中使用case語句,並且我已經定期完成(或者IF語句,或者如果您可以依賴於一個值爲空的原始問題示例SQL沒有明確說明,那麼您可以使用它COALESCE或IFNULL),雖然有一個逗號與一個額外的逗號。 – Kickstart