MySQL: Complesso Dichiarazione che coinvolge due tavoli e una terza tabella di correlazione registrazione
-
26-09-2019 - |
Domanda
Ho due tabelle che sono state costruite per due sistemi diversi. Ho record in una tabella (chiamati "porta") che rappresentano i clienti, e le registrazioni in un'altra tabella (denominata "manager"), che sono l'esatto stessi clienti ma "manager" utilizza campi diversi
(ad esempio, "porta", contiene un indirizzo e-mail, e "manager" contiene due campi per due e-mail diversi - uno dei quali potrebbe essere l'e-mail da "porta").
Così, ho creato una tabella di concordanza che contiene il lead_id e manager_id. Attualmente questa tabella di correlazione è vuota.
Sto cercando di interrogare i "porta" tabella di darmi i record che soddisfano entrambi i campi e-mail "manager" con i "cavi" singolo campo e-mail, mentre allo stesso tempo i campi che sono già stati aggiunti alla ignorare " correlato tabella". (In questo modo posso vedere quanti lead quella partita non sono ancora stati correlato.) Ecco il mio attuale, il tentativo di SQL non valida:
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;
ottengo l'errore: Unknown column 'leads.id' in 'sulla clausola di'
Prima ti chiedi: ci sono record nella tabella "porta" dove leads.project = "someproject" e cadute tra quelle date leads.created!. Ho incluso i parametri aggiuntivi per completezza.
Soluzione
Sono disponibili le tabelle elencate round modo sbagliato in modo che l'ESTERNO LEFT JOIN si unisce al manager
correlation
invece di leads
a correlation
come desiderato. Prova scambiando loro turno:
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;
In generale, io consiglierei di non mescolare lo stile vecchio e nuovo si unisce per evitare esattamente questo tipo di errore. Preferirei vedere qualcosa di simile:
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;