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)

一意のキーワードを含めていないため、データベースでは複数のユーザーが同じユーザー名を持つことができます。テーブルに複数のインスタンスを持つすべてのユーザー名について、ユーザー名のリストとそのユーザー名の最新の signup_date を生成する SQL クエリを作成しました。

select username, MAX(signup_date)
group by username

しかし、上記のクエリから返されたすべてのユーザー名の一意の電子メール アドレスのリストを生成するクエリも作成する必要があり、次のように思いつきました。

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

私の質問は、Having ステートメントの後に条件を記述する必要がありますか? それとも、Having 句を省略すれば、目的の結果が得られるのでしょうか?

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 に答える