【发布时间】:2011-03-31 13:11:06
【问题描述】:
尝试使用 PostgreSQL 检索按日期分组的 ActiveRecord 对象数组。
更具体地说,我正在尝试翻译以下 MySQL 查询:
@posts = Post.all(:group => "date(date)",
:conditions => ["location_id = ? and published = ?", @location.id, true],
:order => "created_at DESC")
我知道 PostgreSQL 对 SQL 标准的解释比 MySQL 更严格,因此这种类型的查询将无法工作......并且已经阅读了 StackOverflow 和其他地方关于该主题的许多帖子 - 但没有一个似乎是关于这个问题的明确答案
我已经尝试了各种查询与 group by 和 distinct 子句的组合,但没有太多乐趣 - 目前我有一个相当不雅的 hack,虽然有效,但当我看到它时让我脸红。
使用 Rails 和 PostgreSQL 进行此类查询的正确方法是什么? (忽略这个肯定应该在 ActiveRecord 级别抽象出来的事实)
【问题讨论】:
-
一个“数组...按日期分组”——这没有任何意义。你想达到什么目的?您可以按日期(日期)订购吗?
-
除 MySQL 以外的任何数据库都会拒绝非法 SQL。数据库不会猜测您今天想要什么结果,数据库应该只在所有情况下得到所有正确的结果。在 MySQL 中使用 ONLY_FULL_GROUP_BY,上述查询也会被 MySQL 拒绝。
-
嗨 Dan - 我正在尝试获取 Post 对象数组,但我只想检索任何给定日期的一个帖子(当天的最新帖子)。
-
并不是说它更严格,而是 MySQL 愿意对一些常见的行为(如自动增量等)做出假设。如果您考虑数据库必须做什么才能检索有序组中的第一行,它基本上是: 1. 检索按组列排序的整个集合 2. 按顺序对组列的每个子集进行排序第 3 条。将每个子集的第一行作为一个全新的集合,然后按顺序对其进行排序 PG 只是不做假设,因此您可以对子查询显式地做同样的事情,这在 PG 中非常有效。跨度>
标签: ruby-on-rails postgresql activerecord