У меня есть структура таблиц:
old_data
| электронная почта | тип |
/////////////////////////////////
клиенты
| электронная почта1 |
///////////////////////////////
мусор
| электронная почта |
Мне нужно найти записи, которых нет в таблице 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 для 1 электронной почты и типа «Учетные записи». То же самое есть в таблице trashes, но не в таблице clients.
Мне нужно написать запрос типа:
Получите все записи из old_data, где нет электронной почты clients, но если электронная почта clients1 соответствует электронной почте old_data, удалите все записи с этими электронными письмами из результата. Но затем, если из этого результата совпадает адрес электронной почты с адресом электронной почты из таблицы trashes, удалите из результата только одну запись с этим адресом электронной почты.
Пожалуйста, помогите, я потерялся...






Вы можете использовать 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.
Мне удалось обработать его с другим параметром.
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');
Спасибо за помощь. :)
Я не могу отметить ваш ответ как полезный.... Но он имеет для меня ценность, так что большое спасибо. :)