mySQL查询中的Case或if
我有这样的桌子: 时间线mySQL查询中的Case或if,mysql,join,Mysql,Join,我有这样的桌子: 时间线 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 name
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 name parent
1 pname1 8
2 pname2 9
3 pname3 3
我需要表格结果
**结果时间线**
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
但这不是正确的语法,这只是我的猜测它会是什么样子 您似乎正在检查相同的值并执行两项不同的操作 但是我想你可能想要这样的东西:-
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
使用
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')
您可以在此处看到结果:
结果与示例结果不匹配,但示例结果似乎与数据不一致,因此我认为这就是您的意思。(更新:我现在编辑了您的示例结果,使其与示例表一致。)您不需要
案例
s;您可以将timeline.pattern作为连接条件的一部分;在字段列表中使用CASE
s这样的选项似乎无论如何都不受支持。你还说了timeline.parent
,意思是timeline.pattern
;我将对其进行编辑。@tgies-您可以在字段列表中使用我经常使用的case语句(或IF语句,或者如果您可以依赖原始问题示例SQL没有明确说明的一个值为null,则可以使用COALESCE或IFNULL),尽管有一个带有额外逗号的输入错误。+1。对于具有联接的解决方案。性能也不错。在@tgies测试,一会儿,如何在parent@dev.nikolaz中的另一个表上查找名称我看不出该表应该如何与您的其他表关联。@tgies我们在表卡中找到了parent,然后这个数字对应于表菜单中的id。参见SQLFIDLE上的示例below@dev.nikolaz只需将另一个join添加到post.parent\u id和card.parent\u id的合并中的join菜单.id
: