我有一个包含以下字段的数据库
Create table users
{
id int NOT NULL,
username varchar(255),
email varchar(255),
signup_date date,
PRIMARY KEY(id)
}
Create index user_index
On users (username)
数据库允许多个用户拥有相同的用户名,因为我没有包含unique关键字。 我写了一个SQL查询,它会为表中有多个实例的所有用户名生成用户名列表和该用户名的最新signup_date。
select username, MAX(signup_date)
group by username
但我还需要编写一个查询,该查询将为从上述查询返回的所有用户名生成唯一电子邮件地址列表,我想出了以下内容:
select distinct email
From users
Group by username
Having max(signup_date)
我的问题是我需要在有声明之后写一个条件吗?或者我只需要省略Having子句,这会给我想要的结果吗?
答案 0 :(得分:2)
您的查询:
select username, MAX(signup_date)
from users
group by username;
将返回所有用户名。你没有过滤器。您的目标是"我还需要编写一个查询,该查询将为从上述查询返回的所有用户名生成唯一的电子邮件地址列表"。这是所有唯一的电子邮件地址。为此:
select distinct email
from users;
我认为你的原始查询应该是:
select username, MAX(signup_date)
from users
group by username
having count(*) > 1;
为了查找重复项。要使用where
子句获取重复项上的所有电子邮件地址:
select distinct email
from users u
where u in (select username
from users
group by username
having count(*) > 1
)
要按用户获取所有电子邮件地址,请尝试:
select username, max(signupdate),
group_concat(distinct email separator ', ' order by signup_date desc)
from users
group by username
having count(*) > 1;
这将以逗号分隔列表的形式为所有用户提供所有电子邮件,以及最大注册日期。
通过电子邮件地址获取所有用户:
select email,
group_concat(distinct username separator ', ' order by signup_date desc)
from users
group by email