我正在尝试为包含非常标准的存档信息的博客构建侧边栏,例如:
2013年8月:3个帖子
2013年7月:5个帖子
2013年6月:4个帖子
...等
ActiveRecord查询将提供反向按时间顺序排序的此信息(month
,year
,count
?
Post模型非常简单 - title
,body
,created_at
,modified_at
列。我正在尝试编写ActiveRecord / Postgres查询,它给出了按月和年分组的帖子数(如上所列)。以下查询成功完成:
Post.select('count(*) as count','extract(year from created_at) as year', 'extract(month from created_at) as month').group('year','month')
但是我希望按时间顺序对列进行明确排序(因此2013年8月在列表中的2013年7月以上),这就是一切都变得混乱的地方。我尝试了以下查询失败,只是为了开始:
Post.select('count(*) as count','extract(year from created_at) as year', 'extract(month from created_at) as month').group('year','month').order(:year => :desc)
它产生以下SQL:
SELECT count(*) as count, extract(year from created_at) as year, extract(month from created_at) as month FROM "posts" GROUP BY year, month ORDER BY "posts"."year" DESC
以下错误:
PG::UndefinedColumn: ERROR: column posts.year does not exist
如果我使用.order(:count => :desc)
按计数排序,查询实际上会运行,但它似乎并没有按照我预期的方式进行排序(切换到:asc
没有任何不同)。
我已经搜索过SO和谷歌但无济于事。我也尝试按created_at
排序,但它会引发ActiveRecord::StatementInvalid: PG::GroupingError: ERROR: column "posts.created_at" must appear in the GROUP BY clause or be used in an aggregate function
错误。理想情况下,我会运行一个简单的Post.order(:created_at => :desc)
,然后对该有序的结果运行分组查询,但我不知道如何。
非常丢失...如何检索包含year
和month
及count
列的帖子,但是按时间顺序排列生成的组?
非常感谢您的帮助!
答案 0 :(得分:1)
并非所有数据库都允许您在GROUP
或ORDER
子句中引用派生列名称。我自己不了解PostgreSQL,但也许它支持相对列引用。试试这个:
SELECT count(*) as count
, extract(year from created_at) as year
, extract(month from created_at) as month
FROM "posts"
GROUP BY 2, 3
ORDER BY 2 DESC, 3 DESC
如果这不起作用,则应该:
SELECT count(*) as count
, extract(year from created_at) as year
, extract(month from created_at) as month
FROM "posts"
GROUP BY extract(year from created_at), extract(month from created_at)
ORDER BY extract(year from created_at) DESC, extract(month from created_at) DESC