2010-12-15 9 views
0

前:如何订购我有一个简单的态表看起来像这样组DBIx ::

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 ::类。我的 “项目” 结果与定义:

__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 

帮助?

+0

我不知道perl或者dbix,但是SQL的做法是让你的'modified'字段变成'Modified',这会返回每个用户的最高日期。 – JNK 2010-12-15 18:31:22

+0

我玩过这一点,使用的东西如下:SELECT item,user,status,MAX(modified)as most_recent FROM item_approval WHERE id = 4;但它不会返回每个用户的最高日期*;它只返回日期最高的单行。 – 2010-12-15 19:09:08

+0

您需要同时执行“MAX(修改)”和“GROUP BY用户”。没有“GROUP”的'MAX'为您提供查询的最大值。 'GROUP BY'为您提供了GROUP BY中每个组的最大值(或其他聚合函数,如'SUM','AVG'等)。 – JNK 2010-12-15 19:31:48

回答

1

从你评论中描述的行为我猜你的数据库是MySQL。 我还假设你的item_approval表有一个主键,我将打电话给PK

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

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

相关问题