プロジェクトで、ステータスが変更される請求書を管理しています。ステータスの変更は、次のような別のデータベース テーブルに保存されます。
|id|invoice_id|user_id|old_status_id|new_status_id|change_date |
-----------------------------------------------------------------------
| 1| 1| 1| 1| 3|2013-11-11 12:00:00|
| 2| 1| 2| 3| 5|2013-11-11 12:30:00|
| 3| 2| 3| 1| 2|2013-11-10 08:00:00|
| 4| 1| 1| 5| 6|2013-11-11 13:10:00|
| 5| 2| 2| 2| 5|2013-11-10 09:00:00|
請求書ごとに、最後のステータス変更を取得したいと考えています。したがって、結果には ID 4 と 5 のレコードが含まれているはずです。
|id|invoice_id|user_id|old_status_id|new_status_id|change_date |
-----------------------------------------------------------------------
| 4| 1| 1| 5| 6|2013-11-11 13:10:00|
| 5| 2| 2| 2| 5|2013-11-10 09:00:00|
Invoice_id でグループ化して max(change_date) を使用すると、最も若い日付が取得されますが、他のフィールドのフィールド値は、グループ内で最も若い日付を含むレコードから取得されません。
それが私にとっての課題 1 です。
課題 2 は、可能であれば、CakePHP のメソッドを使用してクエリを実現することです。
課題 3 は、現在のユーザーに属するレコードに結果をフィルター処理することです。SO 現在のユーザーの ID が 1 の場合、結果は次のようになります。
|id|invoice_id|user_id|old_status_id|new_status_id|change_date |
-----------------------------------------------------------------------
| 4| 1| 1| 5| 6|2013-11-11 13:10:00|
ユーザー ID が 2 の場合、結果は次のようになります。
|id|invoice_id|user_id|old_status_id|new_status_id|change_date |
-----------------------------------------------------------------------
| 5| 2| 2| 2| 5|2013-11-10 09:00:00|
ID 3 のユーザーの場合、結果は空になります。
つまり、ユーザーが最後に変更を行ったかどうかに関係なく、ユーザーが行った最新の変更をすべて検索する必要はありません。代わりに、そのユーザーがこれまでに変更を加えたすべての請求書の変更を見つけたいと考えています。動機は、ユーザーが自分の変更を元に戻せるようにしたいということです。これは、別の変更を行った後に他のユーザーがいない場合にのみ可能です。