получать отдельные записи без запроса NOT IN

64
9

У меня три таблицы (admin, domain, user), как показано ниже

    'admin' (admin_id, email, domain_id, pass) 'domain' (domain_id, name) 'user' (user_id, email, domain_id, pass)

Таблица администратора:

+--------------------------------+         
| 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 |
+------------+

Поэтому мне нужны записи из таблицы пользователей, которых нет в таблице admin.

Есть ли способ сделать это без запроса NOT IN?

спросил(а) 2021-01-19T19:40:17+03:00 6 месяцев, 2 недели назад
1
Решение
77

Есть ли способ сделать это без запроса NOT IN?

Да, используя LEFT JOIN пользователя с администратором.

Если атрибут id в таблицах пользователя и администратора используется для определения того, принадлежат ли две записи одному и тому же пользователю, то ваш LEFT JOIN будет указан в этом атрибуте следующим образом:

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 чтобы решить, что две записи принадлежат одному и тому же пользователю, тогда

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

Изменить:

В соответствии с вашим обновлением вопроса, поскольку электронная почта и домен совместно используются как таблицами администратора, так и пользователя, вы должны ВСПОМОГАТЬ ОБЪЕДИНЯТЬ эти таблицы в этих двух столбцах:

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

ответил(а) 2021-01-19T19:40:17+03:00 6 месяцев, 2 недели назад
63

вы можете сделать это, если 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)

ответил(а) 2021-01-19T19:40:17+03:00 6 месяцев, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема