MySQL: Complejo instrucción de combinación que implica dos mesas y una tercera tabla de correspondencias

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

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.

¿Fue útil?

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;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top