group_by或与postgres / dbix-class不同

时间:2014-03-28 17:21:07

标签: postgresql dbix-class

我有一个像这样的帖子表:

+-----+----------+------------+------------+
|  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对结果进行“分组”,同时提取最新记录(按时间戳desc排序)?

我已经明白我可能不想要“group_by”而是“不同”。我的postgres查询如下所示:

select distinct on (topic_id) topic_id, id, text, timestamp 
from posts 
order by topic_id desc, timestamp desc;

这很有效。但是,我无法弄清楚这是否可以在DBIx :: Class中执行,而无需编写自定义ResultSource :: View。我已尝试使用选择和列进行group_by的各种安排,并尝试使用distinct => 1.如果/当返回结果时,它实际上不保留唯一性。

有没有办法编写我正在尝试通过结果集搜索的查询,或者是否有更好的方法通过不同类型的查询实现相同的结果?

1 个答案:

答案 0 :(得分:1)

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

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

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分组将是这样的:

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"} ],
})

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