首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有postgres/dbix-class的group_by或distinct

带有postgres/dbix-class的group_by或distinct
EN

Stack Overflow用户
提问于 2014-03-29 01:21:07
回答 1查看 407关注 0票数 1

我有一个这样的posts表:

代码语言:javascript
复制
+-----+----------+------------+------------+
|  id | topic_id |    text    |  timestamp |
+-----+----------+------------+------------+
| 789 |     2    |     foobar | 1396026357 |
| 790 |     2    |     foobar | 1396026358 |
| 791 |     2    |     foobar | 1396026359 |
| 792 |     3    |     foobar | 1396026360 |
| 793 |     3    |     foobar | 1396026361 |
+-----+----------+------------+------------+

如何根据主题id对结果进行“分组”,同时拉取最近的记录(按时间戳描述排序)?

我已经认识到,我可能不需要"group_by“,而是"distinct on”。我的postgres查询如下所示:

代码语言:javascript
复制
select distinct on (topic_id) topic_id, id, text, timestamp 
from posts 
order by topic_id desc, timestamp desc;

这很好用。但是,我不知道在DBIx::类中是否可以这样做,而不必编写自定义的ResultSource::View。我尝试过使用selects和columns的不同的group_by排列方式,也尝试过distinct => 1。如果/当返回一个结果时,它实际上不会保持唯一性。

有没有一种方法可以通过结果集搜索来编写我正在尝试的查询,或者是否有更好的方法来通过不同类型的查询获得相同的结果?

EN

回答 1

Stack Overflow用户

发布于 2014-03-29 02:24:55

请查看grouping results上的DBIC Cookbook中的部分。

我相信你想要的是类似这样的东西:

代码语言:javascript
复制
my $rs = $base_posts_rs->search(undef, {
    columns  => [ {topic_id=>"topic_id"}, {text=>"text"}, {timestamp=>"timestamp"} ],
    group_by => ["topic_id"],
    order_by => [ {-desc=>"topic_id"}, {-desc=>"timestamp"} ],
})

编辑:绕过严格的SQL分组的一种快捷方式如下所示:

代码语言:javascript
复制
my $rs = $base_posts_rs->search(undef, {
    columns  => [
        { topic_id  => \"MAX(topic_id)" },
        { text      => \"MAX(text)" },
        { timestamp => \"MAX(timestamp)" },
    ],
    group_by => ["topic_id"],
    order_by => [ {-desc=>"topic_id"}, {-desc=>"timestamp"} ],
})

当然,可以根据需要使用适当的聚合函数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22719372

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档