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

我的问题:如何获得 Fred 和 Jack 的单人最新批准状态集?也就是说,我想得到这个结果集:

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

帮助?

4

1 回答 1

1

根据您评论中描述的行为,我猜您的数据库是 MySQL。我还假设您的item_approval表有一个我将调用的主键PK

一种选择是使用子选择来选择具有最大(最新)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

这是一个相当慢的选项,因为它将为每一行重新运行子选择,然后拒绝每个项目/用户组合的除一行之外的所有内容。其他数据库获得相似结果的方式略有不同。

于 2010-12-15T20:46:17.667 回答