我有一个像这样的帖子表:
+-----+----------+------------+------------+
| 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.如果/当返回结果时,它实际上不保留唯一性。
有没有办法编写我正在尝试通过结果集搜索的查询,或者是否有更好的方法通过不同类型的查询实现相同的结果?
答案 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"} ],
})
当然,根据需要使用适当的聚合函数。