如何根据返回的行选择多列?

时间:2019-10-06 21:11:16

标签: mysql sql

如果我运行SELECT查询并返回其中包含冗余信息的行,那么如何在一行中显示该信息?

当前我的查询是这样的:

SELECT email, first_name, group FROM membership

然后返回结果集,如下所示:

------------------------------------
|    email    | first_name | group |
------------------------------------
|  bob@co.uk  |     bob    |   g1  |
|  jim@co.uk  |     jim    |   g1  |
|  jim@co.uk  |     jim    |   g2  |
|  jane@co.uk |    henry   |   g2  |
------------------------------------

相反,我需要结果集如下所示:

--------------------------------------------
|    email    | first_name | group | group |
--------------------------------------------
|  bob@co.uk  |     bob    |   g1  |       |
|  jim@co.uk  |     jim    |   g1  |   g2  |
|  jane@co.uk |    henry   |   g2  |       |
--------------------------------------------

重要的是,尽管有多余的名称,但列名“ group”的名称不要不同。

编辑:为清楚起见,组数可能会更改。 edit2:我用于初始查询的完整代码是:

SELECT 
    persons.mail AS email,
    persons.fname AS 'first_name',
persons.lname AS 'last_name',
groups.name as add_list
FROM group_membership
LEFT JOIN groups ON group_membership.gid = groups.gid
LEFT JOIN persons ON group_membership.uid = persons.uid
WHERE persons.mail != ""
ORDER BY last_name

3 个答案:

答案 0 :(得分:3)

您要的是不可能的。如果有四行,其值:

|  jim@co.uk  |     jim    |   g2  |

您希望结果中有4列名为group的列,而不是当前显示的group的两列吗?

您可能想要的是:

select email, first_name, group_concat(`group`) group by email, first_name

答案 1 :(得分:1)

对于您的示例数据,它将这样做:

.java

请参见demo
结果:

select email, first_name,
  min(`group`) `group`, 
  case when max(`group`) <> min(`group`) then max(`group`) end `group`
from membership
group by email, first_name 

答案 2 :(得分:0)

根据上述示例,以下内容将适用

     SELECT email, first_name, max(case 
        when 
      group ='g1' then group else null end) 
       as groupg1, 
      max(case 
        when 
      group ='g2' then group else null end) 
       as groupg2
      FROM membership group by email, 
      first_name