MySQL: сложное оператор соединения, включающий две таблицы и третью корреляционную таблицу - PullRequest
0 голосов
/ 12 мая 2010

У меня есть две таблицы, которые были созданы для двух разнородных систем. У меня есть записи в одной таблице (называемые «лидами»), которые представляют клиентов, и записи в другой таблице (называемые «менеджерами»), которые являются точно такими же клиентами, но «менеджер» использует разные поля

(Например, "приводит" содержит адрес электронной почты, а "менеджер" содержит два поля для двух разных электронных писем, каждое из которых может быть электронным письмом от "ведет").

Итак, я создал корреляционную таблицу, которая содержит lead_id и manager_id. В настоящее время эта корреляционная таблица пуста.

Я пытаюсь запросить таблицу «потенциальных клиентов», чтобы получить записи, которые соответствуют либо полю электронной почты «менеджера» с одним полем электронной почты «потенциальных клиентов», но в то же время игнорируя поля, уже добавленные в коррелированная »таблица. (таким образом, я могу видеть, сколько лидов, которые соответствуют, еще не были сопоставлены.) Вот моя текущая, недопустимая попытка 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;

Я получаю сообщение об ошибке: Неизвестный столбец ведет. Идентификатор в предложении

Прежде чем задаться вопросом: в таблице "Есть" есть записи, где ведет.проект! = "Некоторый проект" и ведет.созданные между этими датами. Я включил эти дополнительные параметры для полноты.

1 Ответ

2 голосов
/ 12 мая 2010

Таблицы указаны неверно, поэтому левое внешнее соединение соединяет 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;
...