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