0

我有一个包含以下字段的数据库

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)

该数据库允许多个用户拥有相同的用户名,因为我没有包含唯一关键字。我编写了一个 SQL 查询,该查询将为表中具有多个实例的所有用户名生成用户名列表和该用户名的最新 signup_date。

select username, MAX(signup_date)
group by username

但我还需要编写一个查询,该查询将为从上述查询返回的所有用户名生成唯一电子邮件地址列表,我想出了以下内容:

select distinct email
From users
Group by username
Having max(signup_date)

我的问题是我需要在Having语句之后写一个条件吗?还是我只需要省略 Have 子句,这会给我想要的结果?

4

1 回答 1

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
于 2013-05-24T16:55:20.893 回答