У меня есть простая временная таблица, которая выглядит так:
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. Мой результат "Item" определяется с помощью:
__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'}
});
но "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
Помощь?
modified
полемMAX(modified) as 'Modified'
, которое будет возвращать самую высокую дату для каждого пользователя. - person JNK   schedule 15.12.2010MAX(Modified)
, так иGROUP BY User
.MAX
безGROUP
дает вам максимум для запроса.GROUP BY
дает вам максимум (или другие агрегатные функции, такие какSUM
,AVG
и т. д.) для каждой группы вGROUP BY
. - person JNK   schedule 15.12.2010