0

次のような単純な時間テーブルがあります。

Table: item_approval

item  user  status         modified
2     fred  approved       2010-12-01 00:00:00
3     fred  approved       2010-12-02 00:00:00
4     fred  disapproved    2010-12-03 00:00:00
7     jack  unapproved     2010-12-05 00:00:00
4     fred  approved       2010-12-06 00:00:00
4     jack  unapproved     2010-12-07 00:00:00
4     fred  disapproved    2010-12-04 00:00:00

DBIx::Classを使用しています。私の「アイテム」の結果は次のように定義されます。

__PACKAGE__->has_many(
  "item_approvals",
  "Schema::Result::ItemApproval",
  { "foreign.item" => "self.id" },
  { cascade_copy => 0, cascade_delete => 0 },
);

つまり、私にできることは次のとおりです。

my $item = $schema->resultset('Item')->find({id=>4});

どちらでも構いません。次に、私は行うことができます:

my @approvals = $item->item_approvals;

このような結果セットを取得するには:

item  user  status         modified
4     fred  disapproved    2010-12-03 00:00:00
4     fred  approved       2010-12-06 00:00:00
4     jack  unapproved     2010-12-07 00:00:00
4     fred  disapproved    2010-12-04 00:00:00

私の質問:フレッドとジャックの単一の最新の承認ステータスのセットを取得するにはどうすればよいですか?つまり、この結果セットを取得したいのです。

item  user  status         modified
4     fred  approved       2010-12-06 00:00:00
4     jack  unapproved     2010-12-07 00:00:00

私はこのようなことを試みました:

my @approvals = $item->search({}, {
    group_by => 'user',
    order_by => {-desc => 'modified'}
});

ただし、「ORDERBY」は「GROUPBY」のに実行されるため、代わりに次のようになります。

item  user  status         modified
4     fred  disapproved    2010-12-03 00:00:00
4     jack  unapproved     2010-12-07 00:00:00

ヘルプ?

4

1 に答える 1

1

コメントに記載されている動作から、データベースはMySQLだと思います。また、あなたのitem_approvalテーブルには、私が呼び出す主キーがあると仮定していますPK

1つのオプションは、サブ選択を使用して、最大の(最新の)modified値を持つ行を選択することです。

select item, user, status, modified 
from item_approval me 
where PK = (select s.PK from item_approval s where me.item = s.item and me.user = s.user order by s.modified desc, s.PK desc limit 1) 
and me.item = 4

これは、行ごとにサブ選択を再実行し、アイテムとユーザーの組み合わせごとに1行を除くすべてを拒否するため、かなり遅いオプションです。他のデータベースでは、同様の結果を得る方法が少し異なります。

于 2010-12-15T20:46:17.667 に答える