Ich denke, das reicht.
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
Die Ergebnisse aus den von Ihnen bereitgestellten Daten sind:
+---------+-----------------+------------+-----------+
| 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 |
+---------+-----------------+------------+-----------+
Ich bin besser mit T-SQL vertraut, wo ich die Fensterfunktion row_number() verwenden würde. Die Idee ist, dass das Feld row_number eine Rangfolge jeder Zeile in Bezug darauf anzeigt, ob es sich um die neueste (Wert 1), zweitletzte (Wert 2) usw. Aktion für jede Aufgabe handelt. Die letzte Aktion für jede Aufgabe endet mit einer row_number von 1, sodass Sie diese herausbekommen können, indem Sie nach row_number =1 aus dieser latest_action
filtern Unterabfrage.
Da die latest_action
Unterabfrage insgesamt einmal ausgeführt wird, nicht einmal pro Zeile, ist dies keine große Leistungseinbuße. Leider kann ich nicht versprechen, dass das ganze Setzen/Inkrementieren von Variablen kein großer Leistungseinbruch ist, dies ist das erste Mal, dass ich diese Logik in MySQL verwende, ich weiß nicht, wie leistungsfähig sie ist.
Die Logik zum Reproduzieren der row_number()-Funktionalität von T-SQL stammt von hier: ROW_NUMBER() in MySQL