2014-04-16 24 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