MySQL: Complexe JOIN impliquant deux tables et une troisième table de corrélation
-
26-09-2019 - |
Question
J'ai deux tables qui ont été construits pour deux systèmes disparates. J'ai enregistrements dans une table (appelés « leads ») qui représentent les clients et les dossiers dans une autre table (appelée « gestionnaire ») qui sont les mêmes clients exacts, mais « manager » utilise des champs différents
(Par exemple, « conduit » contient une adresse e-mail, et « gestionnaire » contient deux champs pour deux e-mails différents - qui soit de l'e-mail pourrait être de « leads »).
Alors, j'ai créé un tableau de correspondance qui contient le lead_id et manager_id. actuellement ce tableau de correspondance est vide.
Je suis en train d'interroger les « avancées » table pour me donner des documents qui correspondent soit « manager » champ email avec le single « conduit » champ e-mail, tout en même temps en ignorant les champs qui ont déjà été ajoutés au " Table corrélative ». (. Ainsi, je peux voir combien de pistes qui correspondent à n'ont pas encore été mise en corrélation) Voici mon SQL actuelle, invalide tentative:
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;
Je reçois l'erreur: Unknown column 'leads.id' dans 'sur la clause'
Avant de se demander: il y a des enregistrements de la table « Leads » où leads.project = « someproject » et leads.created se situe entre ces dates!. J'ai inclus ces paramètres supplémentaires pour l'exhaustivité.
La solution
Vous avez les tables répertoriées dans le mauvais sens si l'LEFT OUTER JOIN se joint à manager
correlation
au lieu de leads
à correlation
comme vous le souhaitez. Essayez de les échanger autour de:
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;
En général, je vous recommande de ne pas mélanger le style ancien et le nouveau joint pour éviter exactement ce type d'erreur. Je préfère voir quelque chose comme ceci:
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;