sql >> Databáze >  >> RDS >> Mysql

Jak vybrat nejnovější datum z tohoto dotazu (ne v existující tabulce)?

Myslím, že to funguje.

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

Výsledky z údajů, které jste poskytli, jsou:

+---------+-----------------+------------+-----------+
| 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   |
+---------+-----------------+------------+-----------+

Znám více T-SQL, kde bych použil funkci okna row_number(). Cílem je, aby pole číslo_řádku zobrazovalo pořadí každého řádku z hlediska toho, zda se jedná o nejnovější (hodnota 1), druhou nejnovější (hodnota 2) atd. akce pro každý úkol. Nejnovější akce pro každý úkol končí s row_number 1, takže je můžete získat filtrováním podle row_number =1 z této latest_action poddotaz.

Protože latest_action poddotaz se spustí celkově jednou, ne jednou na řádek, není to velký zásah do výkonu. Bohužel nemohu slíbit, že celá věc s nastavením / inkrementací proměnných není příliš výkonná, toto je poprvé, co jsem tuto logiku použil v MySQL, nevím, jak je výkonná.

Logika, jak reprodukovat funkci row_number() T-SQL pochází odtud: ROW_NUMBER() v MySQL




  1. sql dotaz k určení nejpodobnějšího zboží podle značek

  2. Jak vytvořit inicializátor pro vytvoření a migraci databáze mysql?

  3. Jak používat MATCH v databázovém dotazu Symfony2

  4. Mysql:Jak se dotazovat na sloupec, jehož typ je bit?