SQL-запрос NOT IN из 3 таблиц с условиями - PullRequest
0 голосов
/ 31 января 2019

У меня есть таблицы с описанием:

old_data

|электронная почта |тип |

///////////////////////////////

клиенты

|email1 |

//////////////////////////////

корзины

|email |


Мне нужно найти записи, которых нет в таблице clients, но все еще существует в таблице old_data, где они имеют тип = 'Счета'.Поэтому я написал этот код:

SELECT `email` FROM `old_data`
WHERE `type` = 'Accounts' AND `email` NOT IN (SELECT `email1` FROM `clients`))

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

SELECT * FROM (SELECT `email` FROM `old_data` 
WHERE `type` = 'Accounts' AND `email` NOT IN (SELECT `email1` FROM `clients`)) AS t1 
WHERE t1.email NOT IN (SELECT `email` FROM `trashes`)

Проблема здесь в том, что у меня есть несколько записей в таблице old_data для одного электронного письма и введите «Счета».То же самое в таблице trashes, но не в таблице clients.Мне нужно написать запрос вроде:

Получить все записи из old_data, где нет clients электронной почты, но если clients email1 соответствует old_data электронной почте, удалите все записи с этими электронными письмами из результата.Но затем, если из этого результата сопоставляется электронное письмо с электронным письмом из таблицы trashes, удалите из результата только одну запись с этим электронным письмом.

Пожалуйста, помогите, я потерялся ...

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Мне удалось работать с другим параметром.

SELECT * FROM (SELECT `email`, `secretId` FROM `old_data`
WHERE `type` = 'Accounts' AND `email` NOT IN (SELECT `email1` FROM `clients`)) AS t1 
WHERE t1.secretId NOT IN (SELECT `secretId` FROM `trashes` WHERE `type` = 'Accounts')

Также работает с

SELECT od.`email`, od.`secretId`
FROM `old_data` od
WHERE od.`type` = 'Accounts' AND
      od.`email` NOT IN (SELECT `email1` FROM `clients`) AND
      od.`secretId` NOT IN (SELECT `secretId` FROM `trashes` WHERE `type` = 'Accounts');

Спасибо за помощь.:)

0 голосов
/ 31 января 2019

Вы можете использовать not in, связывая условия.

SELECT od.`email`
FROM `old_data` od
WHERE od.`type` = 'Accounts' AND
      od.`email` NOT IN (SELECT `email1` FROM `clients`) AND
      od.email NOT IN (SELECT `email` FROM `trashes`);

Я предпочитаю not exists с подзапросом, потому что он лучше обрабатывает NULL значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...