Sql 如何在DBIx::Class resultset搜索中检索每个组中的最新记录?

Sql 如何在DBIx::Class resultset搜索中检索每个组中的最新记录?,sql,perl,search,group-by,dbix-class,Sql,Perl,Search,Group By,Dbix Class,我在结果集搜索中使用了groupby。为每个组返回的结果始终是组中id最低的行(即组中最早的行)。我正在寻找一种方法来获取id最高的行(即组中最新的行) 问题与此基本相同: …除了我使用的是DBIx::Class而不是原始SQL之外 把问题放在上下文中: 我有一张音乐评论表 review ------ id artist_id album_id pub_date ...other_columns... 任何给定的艺术家id/专辑id都可以有多个评论。 我想要最新的评论,按日期降序排列,每个艺术

我在结果集搜索中使用了groupby。为每个组返回的结果始终是组中id最低的行(即组中最早的行)。我正在寻找一种方法来获取id最高的行(即组中最新的行)

问题与此基本相同: …除了我使用的是DBIx::Class而不是原始SQL之外

把问题放在上下文中:

我有一张音乐评论表

review
------
id
artist_id
album_id
pub_date
...other_columns...
任何给定的艺术家id/专辑id都可以有多个评论。 我想要最新的评论,按日期降序排列,每个艺术家id/专辑id不超过一篇评论

我尝试使用以下方法进行此操作:

$schema->resultset('Review')->search(
  undef,
  {
    group_by => [ qw/ artist_id album_id / ],
    order_by => { -desc => 'pub_date' },
  }
);
这几乎可以,但返回每个组中最古老的评论,而不是最新的。
如何获取最新的数据库?

要使其正常工作,您需要依赖已损坏的数据库行为。当您使用group by时,您不能从表中选择列,除非它们使用聚合函数(min、max等)或在group by子句中指定

在MySQL中,-尽管它支持它

我认为您需要做的是获取评论的最新日期,max(发布日期):

然后通过循环获得评论:

while (my $review_date = $dates->next) {
    my $review = $schema->resultset('Review')->search({
        artist_id => $review_date->artist_id,
        album_id  => $review_date->album_id,
        pub_date  => $review_date->get_column('recent_pub_date'),
    })->first;
}

是的-这是更多的查询,但很有意义-如果两个审核在同一日期怎么办-DB如何知道在select语句中返回哪一个?

可能
-desc
=>
-asc
?J0HN-在分组完成后应用顺序,这样就不会影响每个组返回的结果。
while (my $review_date = $dates->next) {
    my $review = $schema->resultset('Review')->search({
        artist_id => $review_date->artist_id,
        album_id  => $review_date->album_id,
        pub_date  => $review_date->get_column('recent_pub_date'),
    })->first;
}