MySQL: Complejo instrucción de combinación que implica dos mesas y una tercera tabla de correspondencias
-
26-09-2019 - |
Pregunta
Tengo dos tablas que se construyeron para los dos sistemas dispares. Tengo registros en una tabla (llamadas "pistas") que representan a los clientes, y los registros de otra tabla (llamada "manager") que son exactamente los mismos clientes, sino "manager" utiliza diferentes campos
(Por ejemplo, "cables" contiene una dirección de correo electrónico, y "manager" contiene dos campos de dos mensajes de correo electrónico diferentes - cualquiera de los cuales podría ser el correo electrónico de "pistas").
Por lo tanto, he creado una tabla de correspondencias que contiene el lead_id y MANAGER_ID. Actualmente esta tabla de correspondencias está vacía.
Estoy tratando de consultar las "pistas" mesa para dar constancia de que cualquiera de los campos de correo electrónico partido "manager" con las "pistas" solo campo de correo electrónico, mientras que al mismo tiempo ignorando los campos que ya han sido añadidos a la " "tabla de correlación. (De esta manera puedo ver cuántos clientes potenciales que partido aún no han sido correlacionados.) Aquí está mi actual, el intento de SQL no válido:
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;
Me sale el error: la columna Desconocido 'leads.id' en 'en la cláusula'
Antes uno se pregunta: existen registros de la tabla "clientes potenciales", donde leads.project = "someproject" y caídas entre esas fechas leads.created!. He incluido los parámetros adicionales para completitud.
Solución
Tiene las tablas enumeran la ronda de manera incorrecta por lo que el LEFT OUTER JOIN se une a manager
correlation
en lugar de leads
a correlation
como se pretendía. Prueba a intercambiar ellas redonda:
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 general, yo recomendaría no mezclar el estilo antiguo y el nuevo se une para evitar precisamente este tipo de error. Yo prefiero ver algo como esto:
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;