Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana cara memilih tanggal terbaru dari kueri ini (tidak ada dalam tabel yang ada)?

Saya pikir ini berhasil.

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

Hasil dari data yang Anda berikan adalah:

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

Saya lebih akrab dengan T-SQL, di mana saya akan menggunakan fungsi jendela row_number() . Idenya adalah agar bidang row_number menunjukkan peringkat setiap baris dalam hal apakah itu tindakan terbaru (nilai 1), terbaru kedua (nilai 2) dll. untuk setiap tugas. Tindakan terbaru untuk setiap tugas berakhir dengan row_number 1, jadi Anda bisa mengeluarkannya dengan memfilter row_number =1 dari latest_action ini subkueri.

Karena latest_action subquery dijalankan sekali secara keseluruhan, bukan sekali per baris, itu tidak banyak menghasilkan kinerja. Sayangnya, saya tidak bisa menjanjikan bahwa seluruh variabel pengaturan/peningkatan tidak banyak menghasilkan kinerja, ini adalah pertama kalinya saya menggunakan logika ini di MySQL, saya tidak tahu seberapa kinerjanya.

Logika cara mereproduksi fungsionalitas row_number() T-SQL berasal dari sini: ROW_NUMBER() di MySQL




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PHP-MySQL-Bagaimana cara meningkatkan bidang integer MySQL dengan aman?

  2. Tabel Pivot Menggunakan MySQL

  3. Bagaimana cara memperbarui banyak duplikat dengan nilai berbeda pada tabel yang sama?

  4. Kesalahan saat mengganti nama kolom di MySQL

  5. MySQL:Apakah mungkin untuk 'mengisi' SELECT dengan nilai tanpa tabel?