Tengo 3 tablas: entryrecord, employee y employee_entryrecord (tabla de enlace).

La consulta que me gustaría es que devuelva el registro más reciente (max time) inout de cada empleado.

employee
id employee
1  John
2  Tom

entryrecord
id created_date       inout
1 2016-07-22 16:01:38 1
2 2016-07-22 16:03:22 1
3 2016-07-22 16:05:22 2
4 2016-07-22 16:07:22 2
5 2016-07-22 16:09:22 1


I'd like the follow output
created_date         employee  inout  entryrecordid
2016-07-22 16:09:22  John       1       5
2016-07-22 16:05:22  Tom        2       3

Sin embargo, en el sqlfiddle a continuación, puede ver que no devuelve los valores inout y entryrecordid correctos.

Creé un sqlfiddle para ver lo que hice.

Violín de SQL

Cualquier ayuda sería genial. Gracias.

0
Mudders 23 jul. 2016 a las 17:16

2 respuestas

La mejor respuesta

Por favor inténtalo:

SELECT
finalALias.created_date,
E.employee,
finalALias.inout,
finalALias.id AS entryrecordid
FROM employee E

INNER JOIN 
(
    SELECT 
    *
    FROM entryrecord entryR 
    INNER JOIN 
    (
        SELECT
          EER.employeeid,
          MAX(created_date) max_time
        FROM entryrecord ER
        INNER JOIN employee_entryrecord EER ON ER.id = EER.entryrecordid
        GROUP BY EER.employeeid
    ) t 
    ON t.max_time=entryR.created_date
) AS finalALias
ON E.id = finalALias.employeeid
ORDER BY finalALias.created_date DESC;

DEMO DE TRABAJO

Solo un recordatorio amable:

E -> employee

ER -> entryrecord

ERR -> employee_entryrecord

1
1000111 24 jul. 2016 a las 10:45

El problema es que la agrupación ocurre antes de realizar el pedido. Tendrá que hacer una subconsulta. Siempre desea intentar mantener sus subconsultas al mínimo, ya que suponen un gran costo para el servidor SQL.

Cambié su LEFT JOINS a INNER JOINS porque parecía que solo deseaba obtener empleados que estaban en las otras tablas.

SELECT 
    entryrecord.created_date, 
    employee.employee, 
    entryrecord.inout,
    entryrecord.id 
FROM 
    entryrecord 
INNER JOIN 
    employee_entryrecord ON entryrecord.id = employee_entryrecord.entryrecordid 
INNER JOIN 
    employee ON employee_entryrecord.employeeid = employee.id 
WHERE 
    entryrecord.inout in (1,2) 
    AND entryrecord.id = (
        SELECT er2.id 
        FROM employee_entryrecord eer2, entryrecord er2 
        WHERE eer2.employeeid = employee.id 
        AND er2.id = eer2.entryrecordid 
        ORDER BY er2.created_date DESC LIMIT 1
    )
1
Sean 23 jul. 2016 a las 20:12