[英]How can I SELECT multiple columns based on rows returned?
如果我运行 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 | |
--------------------------------------------
重要的是,列名“组”尽管是多余的,但不会以不同的方式命名。
编辑:为清楚起见,组的数量可能会改变。 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
你所要求的是不可能的。 如果有四行的值:
| jim@co.uk | jim | g2 |
您是否希望结果有 4 个名为group
的列,而不是您当前显示的两个group
列?
你可能想要的是:
select email, first_name, group_concat(`group`) group by email, first_name
对于您的示例数据,这将执行以下操作:
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
请参阅演示。
结果:
> email | first_name | group | group
> :--------- | :--------- | :---- | :----
> bob@co.uk | bob | g1 |
> jane@co.uk | henry | g2 |
> jim@co.uk | jim | g1 | g2
根据上面的示例,以下将起作用
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.