MySQL: Komplexe Join-Anweisung, die zwei Tabellen und eine dritte Korrelationstabelle
-
26-09-2019 - |
Frage
Ich habe zwei Tabellen, die für zwei unterschiedliche Systeme gebaut wurden. Ich habe Datensätze in einer Tabelle (genannt „Leads“), die Kunden und Datensätze in einer anderen Tabelle (genannt „Manager“), die exakt die gleichen Kunden, sondern „Manager“ verwenden verschiedene Felder
repräsentieren(Beispiel: „Leads“ enthält eine E-Mail-Adresse und „Manager“ enthält zwei Felder für zwei verschiedene E-Mails - von denen jeder die E-Mail von „Leads“ sein könnte).
Also, ich habe eine Korrelationstabelle erstellt, die die lead_id und manager_id enthält. zur Zeit diese Korrelationstabelle ist leer.
Ich versuche, die „Leads“ Tabelle abzufragen, um zu mir berichtet, dass Spiel entweder „Manager“ E-Mail-Feld mit der Single „Leads“ E-Mail-Feld, während gleichzeitig die Felder zu ignorieren, die bereits auf die hinzugefügt wurden " korrelierte“-Tabelle. (Auf diese Weise kann ich sehen, wie viele Leads, dass Spiel noch nicht korrelierte.) Hier ist mein aktueller, ungültiger SQL-Versuch:
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;
bekomme ich den Fehler: Unknown column 'leads.id' in 'on-Klausel'
Bevor Sie fragen sich: es gibt Aufzeichnungen in der „Leads“ Tabelle, wo leads.project = „someproject“ und fällt zwischen diesen Daten leads.created!. Ich habe diese zusätzlichen Parameter der Vollständigkeit halber aufgeführt.
Lösung
Sie haben die Tabellen falsch herum aufgeführt, so dass die LEFT OUTER JOIN wird manager
zu correlation
Beitritt statt leads
zu correlation
wie beabsichtigt. Versuchen Sie tauschen sie um:
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;
Generell würde ich empfehlen, nicht Mischen alten und neuen Stil verbindet genau diese Art von Fehlern zu vermeiden. Ich würde es vorziehen, so etwas zu sehen:
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;