使用 MySQL 中的 CASE 嵌套 SELECT 语句返回多个列

7

有更好的方法吗?

SELECT subs. * ,
       CASE subs.member_type
         WHEN 'member' THEN 
         ( SELECT CONCAT_WS( ' ', members.first_name, members.last_name )
             FROM members
            WHERE members.id = subs.member_id)
         ELSE 
         ( SELECT members_anon.username
             FROM members_anon
            WHERE members_anon.id = subs.member_id)
       END AS fullname,
       CASE subs.member_type
         WHEN 'member' THEN 
         ( SELECT members.email
             FROM members
            WHERE members.id = subs.member_id)
         ELSE 
         ( SELECT members_anon.email
             FROM members_anon
            WHERE members_anon.id = subs.member_id)
       END AS email
  FROM subs
 WHERE subs.item_id =19
   AND subs.item_type = 'blog'
 LIMIT 0 , 30

理想情况下,我希望只有一个CASE部分,从相关的表中返回名称和电子邮件。
2个回答

4
我会在两个表格上使用左外连接:
```

我会在两个表格上使用左外连接:

```
SELECT subs. * ,
       CASE subs.member_type
         WHEN 'member' THEN CONCAT_WS( ' ', m.first_name, m.last_name )
         ELSE ma.username
       END AS fullname,
       CASE subs.member_type
         WHEN 'member' THEN m.email
         ELSE ma.email
       END AS email
  FROM subs
  LEFT OUTER JOIN members m on (m.id = subs.member_id)
  LEFT OUTER JOIN members_anon ma on (ma.id = subs.member_id)
 WHERE subs.item_id =19
   AND subs.item_type = 'blog'
 LIMIT 0 , 30

关于“仅一个条件”的情况,如果您需要在结果集中有两个不同的列,您需要使用两个case语句。


谢谢您的回答,它很有效。但我不确定我完全理解了 - 如果括号内的比较为true,那么LEFT OUTER连接才会实现吗? - Michael Robinson
啊哈!我现在明白了。case语句会将选择项添加到SELECT部分,所以如果subs.member_type = 'member',那么SELECT部分将是:subs.*,m.username,m.email。所以ma上的LEFT OUTER会被执行,但不会包含在结果集中。对吗?我想这不会对性能产生任何影响,因为所有的*.id列都是主键,对吧? - Michael Robinson

2
您不能使用单个 case 表达式来处理两个不同的列...

请使用:

   SELECT s. *,
          CASE s.member_type
            WHEN 'member' THEN x.fullname
            ELSE y.fullname
          END AS fullname,
          CASE subs.member_type
            WHEN 'member' THEN x.email
            ELSE y.email
          END AS email
     FROM SUBS s
LEFT JOIN (SELECT m.id,
                  CONCAT_WS( ' ', members.first_name, members.last_name ) AS fullname,
                  m.email
             FROM MEMBERS m) x ON x.id = s.member_id
LEFT JOIN (SELECT ma.id,
                  ma.username,
                  ma.email
             FROM MEMBERS_ANON ma) y ON y.id = s.member_id                         
    WHERE s.item_id = 19
      AND s.item_type = 'blog'
    LIMIT 0 , 30

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接