前の注文方法:私は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
ヘルプ?
私はperlやdbixを知らないのですが、これを行うSQLの方法は、あなたの 'modified'フィールドを' Modified 'として 'MAX(変更済み)'にすることです。 – JNK
私はこのようなものを少し使っています:SELECT item、user、status、MAX(変更済み)as most_recent FROM item_approval WHERE id = 4;ユーザーごとに最高の日付*を返しません。最高の日付を持つ単一の行を返します。 –
あなたは 'MAX(Modified)'と 'GROUP BY User'の両方を行う必要があります。 'GROUP'を持たない' MAX'はあなたに問い合わせの最大値を与えます。 'GROUP BY'は' GROUP BY'の各グループのmax(または 'SUM'、' AVG'などの集計関数)を提供します。 – JNK