Как получить данные, которые есть хотя бы в одной таблице из нескольких связанных в MYSQL - PullRequest
0 голосов
/ 01 мая 2018

Мне нужна помощь в решении проблемы с SQL.

У меня есть три таблицы, Table1, Table2, Table3, все с полем «электронной почты», с которым они связаны друг с другом.

С другой стороны, у меня есть массив со списком электронных писем, которые я должен проверить, находятся ли они в одной из этих таблиц. Эти электронные письма также сохраняются в строке, разделенной запятыми, и с соответствующими кавычками, чтобы использовать их в IN (....):

$emails = ("'email1@example.com', 'email2@example.com', ....");

SELECT * 
FROM Table t1 
INNER JOIN Table2 t2 ON t1.email = t2.email 
INNER JOIN Table3 t3 ON t1.email = t3.email 
WHERE (t1.email IN ($ emails)) OR (t2.email IN ($ emails) ) OR (t3.email IN ($ emails));

В предыдущем примере я понял, что при выполнении INNER JOIN я сопоставлял таблицы по полю электронной почты, значение которого не во всех таблицах. Может случиться так, что электронное письмо не в какой-то таблице, а в другой да, поэтому мне нужен запрос SQL, чтобы получить электронные письма, которые находятся в ЛЮБОЙ из 3 таблиц.

Мне сказали, что я сделал временную таблицу из массива электронных писем, а затем выполнил ЛЕВОЕ СОЕДИНЕНИЕ между таблицами, и я смог ее получить, но я не знаю, как это сделать.

Не могли бы вы дать мне представление о том, как решить эту проблему?

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Вам нужно использовать UNION, а не JOIN.

SELECT email, "Table1" AS whichTable
FROM Table1
WHERE email in ($email)
UNION
SELECT email, "Table2" AS whichTable
FROM Table2
WHERE email in ($email)
UNION
SELECT email, "Table3" AS whichTable
FROM Table3
WHERE email in ($email)

Использование SELECT * во всех запросах предполагает, что все таблицы имеют одинаковые столбцы в одинаковом порядке. Если нет, вам нужно будет явно перечислить столбцы в каждом запросе.

0 голосов
/ 01 мая 2018

Вот простой способ, который должен возвращать единственное логическое значение. EXISTS полезен, потому что он (должен) игнорировать просмотр любых дополнительных строк, как только найдет одну.

SELECT 
   EXISTS (SELECT * FROM table1 WHERE email IN (...))
   OR
   EXISTS (SELECT * FROM table2 WHERE email IN (...))
   OR
   EXISTS (SELECT * FROM table3 WHERE email IN (...))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...