2010-05-11 3 views
0

J'ai deux tables qui ont été construites pour deux systèmes disparates. J'ai des enregistrements dans une table (appelés "leads") qui représentent les clients et des enregistrements dans une autre table (appelée "manager") qui sont exactement les mêmes clients mais "manager" utilise des champs différentsMySQL: déclaration de jointure complexe impliquant deux tables et une troisième table de corrélation

(Par exemple, "leads" "contient une adresse e-mail, et" manager "contient deux champs pour deux e-mails différents - dont l'un peut être l'email de" leads "). J'ai donc créé une table de corrélation qui contient le lead_id et le manager_id. actuellement cette table de corrélation est vide. J'essaie d'interroger la table "leads" pour me donner des enregistrements qui correspondent à un champ email "manager" avec le seul champ email "leads", tout en ignorant les champs qui ont déjà été ajoutés au Table "corrélée". (Cette façon, 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 vous demander: il existe des enregistrements dans la table "leads" où leads.project! = "Someproject" et leads.created tombe entre ces dates. J'ai inclus ces paramètres supplémentaires pour l'exhaustivité.

+0

Pls sortie poste de 'LEADS' DESC: http://dev.mysql.com/doc/refman/5.0/en/describe.html –

Répondre

2

Vous avez les tables répertoriées au mauvais tour de manière si l'LEFT OUTER JOIN se joint à manager-correlation au lieu de leads-correlation comme vous le souhaitez. Essayez de les échanger:

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 recommande de ne pas mélanger les jointures de style ancien et nouveau pour éviter 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; 
+0

Merci pour la clarification! – Stephen

Questions connexes