MySQL: Комплексное заявление присоединиться к двум таблицам и третьей корреляционной таблице
-
26-09-2019 - |
Вопрос
У меня есть две столы, которые были построены для двух разумных систем. У меня есть записи в одной таблице (называемые «ведущими»), которые представляют клиентов и записи в другой таблице (называемый «менеджер»), которые являются тойными теми же клиентами, но «менеджер» использует разные поля
(Например, «LIDES» содержит адрес электронной почты, а «менеджер» содержит два поля для двух разных электронных писем - любой из которых может быть электронный адрес от «ведущих»).
Итак, я создал корреляционную таблицу, которая содержит Lead_ID и Manager_ID. В настоящее время эта корреляционная таблица пуста.
Я пытаюсь запрашивать таблицу «Ведущую», чтобы дать мне записи, которые соответствуют полем электронной почты «Manager» с одним полем электронной почты Single «LEADS», а в то же время игнорируя поля, которые уже были добавлены в таблицу «коррелированные» Отказ (Таким образом, я вижу, сколько ведущих ведущих, которые совпадают еще не коррелировали.) Вот моя текущая, неверная попытка SQL:
SELECT leads.id, manager.id
FROM leads, manager
LEFT OUTER JOIN correlation ON correlation.lead_id = leads.id
WHERE correlation.id IS NULL
AND leads.project != "someproject"
AND (manager.orig_email = leads.email OR manager.dest_email = leads.email)
AND leads.created BETWEEN '1999-01-01 00:00:00' AND '2010-05-10 23:59:59'
ORDER BY leads.created ASC;
Я получаю сообщение об ошибке: Неизвестный столбец «LIDS.ID» в пункте «В разделе»
Перед вопросом: в таблице «Ведущих» есть записи, где Leads.Project! = «Некоторые продукты» и свинца. Я включил эти дополнительные параметры для полноты.
Решение
У вас есть таблицы перечислены неправильный путь, поэтому левое внешнее соединение присоединяется manager
к correlation
вместо leads
к correlation
как вы намереваетесь. Попробуйте обнять их раунд:
SELECT leads.id, manager.id
FROM manager, leads
LEFT OUTER JOIN correlation ON correlation.lead_id = leads.id
WHERE correlation.id IS NULL
AND leads.project != "someproject"
AND (manager.orig_email = leads.email OR manager.dest_email = leads.email)
AND leads.created BETWEEN '1999-01-01 00:00:00' AND '2010-05-10 23:59:59'
ORDER BY leads.created ASC;
В целом я рекомендую не смешивать старые и новые стиль, чтобы избежать именно этого типа ошибки. Я бы предпочел увидеть что-то вроде этого:
SELECT leads.id, manager.id
FROM leads
LEFT OUTER JOIN correlation ON correlation.lead_id = leads.id
JOIN manager ON manager.orig_email = leads.email OR manager.dest_email = leads.email
WHERE correlation.id IS NULL
AND leads.project != "someproject"
AND leads.created BETWEEN '1999-01-01 00:00:00' AND '2010-05-10 23:59:59'
ORDER BY leads.created ASC;