получать отдельные записи без запроса NOT IN
У меня три таблицы (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?
Есть ли способ сделать это без запроса 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
вы можете сделать это, если 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)