我需要创建一个查询,从特定的表中选择具有多个不同电子邮件的用户。为了区分用户,我根据两个字段对它们进行分组:名称和年龄。让我们看一下这个例子。
所以我有一张这样的表:
name age email phone
----------------------------------
Andy 20 Andy@du 1234
Berni 21 Berni@du 2345
Carol 22 Carol@du 3456
Andy 20 Andy@du 4321
Berni 21 Berni@et 2345
Dody 28 Dodi@du 7869
Carol 22 Carol@pt 3456
我想得到的是:
Berni 21 Berni@du, Berni@et
Carol 22 Carol@du, Carol@pt
请注意,Andy在数据库中也是两次但是使用相同的电子邮件(电话号码有什么变化)。由于这个用户,我需要对电子邮件进行区分,因此只选择具有两个不同电子邮件的用户。
通过此查询,我能够解决问题并获得所需的结果。
select * from
(
select aux.name,
aux.age,
concat_ws(',',collect_set(email)) as email
FROM
(select a.name, a.age, a.email
FROM TestUsers a
RIGHT JOIN
(select name,
age
FROM TestUsers
GROUP BY
name,
age
having count(*) > 1
)b
ON a.name = b.name
AND a.age = b.age
)aux
GROUP BY aux.name,
aux.age
)tr
where locate(",",tr.email) > 0;
但我确信它必须比检查电子邮件字段中没有逗号(这意味着多封电子邮件)时更有效。
有没有人想过更好的方法?
答案 0 :(得分:2)
如果我理解正确,您应该可以使用having
子句来执行此操作:
select tu.name, tu.age,
concat_ws(',', collect_list(tu.email)) as emails
from (select distinct tu.name, tu.age, tu.email
from TestUsers tu
) tu
group by tu.name, tu.age
having count(*) > 1;
实际上,因为collect_set()
删除了重复项,所以这应该没有子查询:
select tu.name, tu.age,
concat_ws(',', collect_set(tu.email)) as emails
from testusers tu
group by tu.name, tu.age
having min(tu.email) <> max(tu.email);