Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment sélectionner la dernière date de cette requête (pas dans une table existante) ?

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