2010-12-15 5 views
0

前の注文方法:私はDBIx ::クラスを使用してい私はこのようになりますシンプルな一時テーブルを持っているDBIx ::とGROUPクラス

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 

。私にできることを意味し、どの

__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}); 

を。その後、私が行うことができます:どのように私はフレッドとジャックの単一の最も最近の承認ステータスのセットを取得します:

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 

私の質問:

my @approvals = $item->item_approvals; 

は、このような結果セットを取得するには?それは私がこのResultSetを取得したい、次のとおりです。

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'} 
}); 

が、 "ORDER BY" が "GROUP BY" の後にを実行するので、私が取得されます代わりにこのようなもの:

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

ヘルプ?

+0

私はperlやdbixを知らないのですが、これを行うSQLの方法は、あなたの 'modified'フィールドを' Modified 'として 'MAX(変更済み)'にすることです。 – JNK

+0

私はこのようなものを少し使っています:SELECT item、user、status、MAX(変更済み)as most_recent FROM item_approval WHERE id = 4;ユーザーごとに最高の日付*を返しません。最高の日付を持つ単一の行を返します。 –

+0

あなたは 'MAX(Modified)'と 'GROUP BY User'の両方を行う必要があります。 'GROUP'を持たない' MAX'はあなたに問い合わせの最大値を与えます。 'GROUP BY'は' GROUP BY'の各グループのmax(または 'SUM'、' AVG'などの集計関数)を提供します。 – JNK

答えて

1

あなたのコメントに記述されている動作から、データベースがMySQLであると推測しています。 私はitem_approvalテーブルに私がPKと呼ぶプライマリキーを持っていると仮定しています。

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つのオプションは、modified値を最大(最新)を持つ行を選択する選択サブを使用することです各項目/ユーザーの組み合わせごとに1行を除くすべての行を拒否します。 他のデータベースでも同様の結果が得られる方法は少し異なります。

関連する問題