1

以下に示すように、3つのテーブル(管理者、ドメイン、ユーザー)があります

  • 「admin」(admin_id、電子メール、domain_id、パス)
  • 「ドメイン」(domain_id、名前)
  • 'user' (user_id、電子メール、domain_id、パス)

管理テーブル:

+--------------------------------+         
| admin_id | email | domain_id  |          
+--------------------------------+         
| 1        | aaa   | 2034       |        
| 2        | bbb   | 3034       |
| 3        | ccc   | 2034       | 
+--------------------------------+

ユーザーテーブル

+--------------------------------+         
| user_id | email | domain_id  |          
+--------------------------------+         
| 11        | aaa   | 2034       |        
| 12        | bbb   | 3034       |
| 13        | ccc   | 2034       | 
| 15        | ddd   | 2034       | 
| 16        | eee   | 3034       |
+--------------------------------+

ドメイン テーブル:

+-----------------------+         
| domain_id | name    |          
+-----------------------+         
| 2034      | aaa.com |        
| 3034      | bbb.com |
+-----------------------+

出力:

+------------+
|ddd@aaa.com |
|eee@bbb.com |
+------------+

したがって、管理テーブルに存在しないユーザー テーブルのレコードが必要です。

NOT IN クエリなしでこれを行う方法はありますか?

4

2 に答える 2

2

NOT INクエリなしでこれを行う方法はありますか?

はい、adminでユーザーのLEFTJOINを使用します。

userテーブルとadminテーブルの属性を使用して、2つのレコードが同じユーザーに属しているかどうかを判断する場合id、次のように、LEFTJOINがこの属性になります。

SELECT CONCAT(u.email, CONCAT('@', d.name))
FROM 
    user u
    JOIN domain d
    ON u.domain_id = d.domain_id
    LEFT JOIN admin a
    ON u.id = a.id
WHERE 
    a.id IS NULL

id属性だけでは不十分でdomain_id、2つのレコードが同じユーザーに属していると判断する必要がある場合は、

SELECT CONCAT(u.email, CONCAT('@', d.name))
FROM 
    user u
    JOIN domain d
    ON u.domain_id = d.domain_id
    LEFT JOIN admin a
    ON u.id = a.id AND u.domain_id = a.domain_id
WHERE 
    a.id IS NULL

編集

質問の更新に従って、電子メールとドメインは管理者テーブルとユーザーテーブルの両方で共有されるため、これらの2つの列でこれらのテーブルを左に結合する必要があります。

SELECT CONCAT(u.email, CONCAT('@', d.name))
FROM 
    user u
    JOIN domain d
    ON u.domain_id = d.domain_id
    LEFT JOIN admin a
    ON u.email = a.email AND u.domain_id = a.domain_id
WHERE 
    a.email IS NULL
于 2012-10-27T09:24:58.973 に答える
1

あなたはそれを行うことができますnot exists

select u1.email+'@'+d1.name
from user u1 join domains d1 on u1.domain_id = d1.domain_id
where not exists 
(select 1 from admin where email = u1.email and domain_id = u1.domain_id)
于 2012-10-27T09:25:44.183 に答える