Je pense que ça le fait.
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
Les résultats des données que vous avez fournies sont :
+---------+-----------------+------------+-----------+
| 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 |
+---------+-----------------+------------+-----------+
Je suis plus familier avec T-SQL, où j'utiliserais la fonction de fenêtre row_number(). L'idée est que le champ row_number affiche un classement de chaque ligne selon qu'il s'agit de l'action la plus récente (valeur 1), la deuxième plus récente (valeur 2), etc. pour chaque tâche. L'action la plus récente pour chaque tâche se termine par un row_number de 1, vous pouvez donc les obtenir en filtrant sur row_number =1 à partir de cette latest_action
sous-requête.
Parce que la latest_action
la sous-requête est exécutée une fois dans l'ensemble, pas une fois par ligne, ce n'est pas vraiment un impact sur les performances. Malheureusement, je ne peux pas promettre que l'ensemble de la configuration/incrémentation des variables n'est pas vraiment un impact sur les performances, c'est la première fois que j'utilise cette logique dans MySQL, je ne sais pas à quel point elle est performante.
La logique de reproduction de la fonctionnalité row_number() de T-SQL vient d'ici : ROW_NUMBER() dans MySQL