相关疑难解决方法(0)

将MySQL select转换为PostgreSQL

我有这个查询在MySQL中正常工作.更多背景信息在这里.

SELECT c.*, SUM(ABS(v.vote)) AS score
FROM categories c,items i, votes v
    WHERE c.id = i.category_id
    AND i.id = v.voteable_id
    AND v.created_at > '#{1.week.ago}'
GROUP BY c.id
ORDER BY score DESC LIMIT 8;
Run Code Online (Sandbox Code Playgroud)

我尝试在PostgreSQL中运行它,它失败了这个错误消息.

PGError:错误:列"c.name"必须出现在GROUP BY子句中或用于聚合函数

我不确定这是什么意思,所以我尝试在group by子句中将"c.id"更改为"c.name"(假设项目的名称是唯一的,两者在MySQL中的工作方式相同).

然而,这只是产生了另一个类似的错

PGError:错误:列"c.id"必须出现在GROUP BY子句中或用于聚合函数

如何解决这个问题?

mysql sql postgresql

14
推荐指数
2
解决办法
9410
查看次数

Rails ActiveRecord组按日期将结果转换为子集合

我正在尝试在Rails 3.1中执行ActiveRecord查询,其中我将结果排序为分组项的子集合,在这种情况下按日期分组.

我认为我的代码可以解释得最好.这是我的方法,它可以工作,但会发出4个查询来完成工作.这样做似乎效率不高.

def entry_days
  days = @user.entry_groups.find(
    :all,
    :select => 'date',
    :limit => 3,
    :group => 'date').map(&:date)

  entry_days = days.map do |date|
    { :date =>  date,
      :entry_groups => @user.entry_groups.find_all_by_date(date)
    }
  end      
end
Run Code Online (Sandbox Code Playgroud)

使用Dave Newton的建议使用group_by,我重写了这样的方法:

def entry_days
  dates_with_entries = @user.entry_groups.find(
    :all,
    :select => 'date',
    :limit => 3,
    :group => 'date').map(&:date)

  @user.entry_groups.where(:date => dates_with_entries).all.group_by(&:date).
    map do |date, entry_groups|
      { :date => date,
        :entry_groups => entry_groups }
    end
end
Run Code Online (Sandbox Code Playgroud)

至少我现在只有2个查询.

然后我再次重写这个方法,如下所示:

  dates_with_entries = user.entry_groups.all(
      :select => 'date',
      :limit => num_days,
      :order => …
Run Code Online (Sandbox Code Playgroud)

activerecord ruby-on-rails

6
推荐指数
1
解决办法
1万
查看次数

标签 统计

activerecord ×1

mysql ×1

postgresql ×1

ruby-on-rails ×1

sql ×1