Tener problemas para usar LEFT Joins en dos tablas

Tengo tres mesas. Entradas, historial de entradas y clasificación. Me gustaría contar cuántos boletos han completado los empleados, pero desglosados ​​por clasificación.

Como ejemplo, el Empleado A trabajó en 3 tickets. Los dos primeros tickets se clasificaron como errores y el último fue una característica. Me gustaría consultar la base de datos y seleccionar todos los tickets en los que el empleado cambió el estado del ticket.

Algo como esto:

error..... 2

Característica...... 1

Interfaz de usuario... 0

Solicitud..... 0

En este momento, todo lo que puedo obtener es esto:

error..... 2

Característica...... 1

Usando esta consulta:

SELECT c.id, c.description, count(c.id)
FROM classification c
LEFT JOIN ticket t on t.classification_id = c.id
LEFT JOIN ticket_history th on th.ticket_num = t.id 
WHERE th.employee = '456'
AND th.from_state = '2' AND th.to_state = '3'
GROUP BY c.id
ORDER BY c.id

He creado una SQL Fiddle con datos de muestra, pero aún no he logrado encontrar una solución.

preguntado el 09 de marzo de 12 a las 22:03

¿Debería moverlos del violín SQL al cuerpo de la pregunta? -

@HLGEM - mira el enlace SQL Fiddle -

@arcdegree no puede ayudar tener al menos la consulta en la pregunta:

1 Respuestas

El primer problema es que no todas las filas del classification se selecciona la tabla, pero solo aquellos con entradas correspondientes en las otras dos tablas. Esto se debe a que ha puesto algunas condiciones que dependen de las entradas de esas tablas en la cláusula WHERE. Básicamente, está haciendo LEFT JOIN para abordar exactamente este problema, pero lo socava poniendo las condiciones en DONDE y no en LEFT JOIN ... ON.

El segundo problema es que cuentas el número de clasificaciones cuando en realidad quieres el número de entradas, ¿no? Así que cambia count(c.id) a count(t.id) para obtener los números correctos.

SELECT c.id, c.description, count(t.id)
FROM classification c
LEFT JOIN ticket t on t.classification_id = c.id
LEFT JOIN ticket_history th on th.ticket_num = t.id
AND th.employee = '456'
AND th.from_state = '2' AND th.to_state = '3'
GROUP BY c.id
ORDER BY c.id;

respondido 09 mar '12, 22:03

Gracias, eso es justo lo que estaba buscando. - grado de arco

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.