MySQL: Complesso Dichiarazione che coinvolge due tavoli e una terza tabella di correlazione registrazione

StackOverflow https://stackoverflow.com/questions/2814712

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.

È stato utile?

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;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top