Creo que esto lo hace.
select
t_task.task_id,
t_task.task_name,
latest_action.act_date,
IFNULL(t_act_d.act_name, 'Pending') as act_name
from
t_task
left outer join (
select
@row_num := IF(@prev_value=concat_ws('', t_act.task_id),@row_num+1, 1) as row_number,
t_act.task_id,
t_act.act_id,
t_act.act_date,
@prev_value := concat_ws('', t_act.task_id) as z
from
t_act,
(select @row_num := 1) x,
(select @prev_value := '') y
order by
t_act.task_id,
t_act.act_date desc
) as latest_action on
t_task.task_id = latest_action.task_id
left outer join t_act_d on
latest_action.act_id = t_act_d.act_id
where
latest_action.row_number = 1 or
latest_action.row_number is null
order by
case when latest_action.act_date is null then '9999-01-01' else latest_action.act_date end
Los resultados de los datos que proporcionó son:
+---------+-----------------+------------+-----------+
| task_id | task_name | act_date | act_name |
+---------+-----------------+------------+-----------+
| A1 | PC Proc | 2017-07-17 | Execution |
| A2 | Printer Proc | 2017-07-21 | Surveying |
| A3 | Stationery Proc | NULL | Pending |
+---------+-----------------+------------+-----------+
Estoy más familiarizado con T-SQL, donde usaría la función de ventana row_number(). La idea es hacer que el campo número_fila muestre una clasificación de cada fila en términos de si es la acción más reciente (valor 1), la segunda más reciente (valor 2), etc. para cada tarea. La acción más reciente para cada tarea termina con un número de fila de 1, por lo que puede obtenerlos filtrando por número de fila =1 de esta latest_action
subconsulta
Porque la latest_action
la subconsulta se ejecuta una vez en general, no una vez por fila, no es un gran impacto en el rendimiento. Desafortunadamente, no puedo prometer que toda la variable configuración / incremento no sea un gran impacto en el rendimiento, esta es la primera vez que uso esta lógica en MySQL, no sé qué rendimiento tiene.
La lógica de cómo reproducir la funcionalidad row_number() de T-SQL proviene de aquí: ROW_NUMBER() en MySQL