相关疑难解决方法(0)

PostgreSQL GROUP BY与MySQL不同?

我一直在将一些MySQL查询迁移到PostgreSQL以使用Heroku.我的大多数查询工作正常,但当我使用group by时,我仍然遇到类似的重复错误:

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

有人能告诉我我做错了什么吗?


MySQL 100%工作:

SELECT `availables`.*
FROM `availables`
INNER JOIN `rooms` ON `rooms`.id = `availables`.room_id
WHERE (rooms.hotel_id = 5056 AND availables.bookdate BETWEEN '2009-11-22' AND '2009-11-24')
GROUP BY availables.bookdate
ORDER BY availables.updated_at
Run Code Online (Sandbox Code Playgroud)


PostgreSQL错误:

ActiveRecord :: StatementInvalid:PGError:错误:列"availables.id"必须出现在GROUP BY子句中或用于聚合函数:
SELECT"availables".*FROM"availables"INNER JOIN"rooms"ON"rooms". id ="availables".room_id WHERE(rooms.hotel_id = 5056 AND availables.bookdate BETWEEN E'2009-10-21'EN'E'2009-10-23')GROUP BY availables.bookdate ORDER BY availables.updated_at


生成SQL的Ruby代码:

expiration = Available.find(:all,
    :joins => [ :room ],
    :conditions => [ "rooms.hotel_id = ? AND availables.bookdate BETWEEN ? AND ?", hostel_id, date.to_s, (date+days-1).to_s ], …
Run Code Online (Sandbox Code Playgroud)

mysql sql postgresql ruby-on-rails heroku

69
推荐指数
4
解决办法
3万
查看次数

Rails:加入多个条件

我有一个简单的模型

class Interest < ActiveRecord::Base
  has_and_belongs_to_many :user_profiles
end

class UserProfile < ActiveRecord::Base
  has_and_belongs_to_many :interests
end
Run Code Online (Sandbox Code Playgroud)

当我想查询具有特定兴趣的所有用户时,这很简单

UserProfile.joins(:interests).where('interests.id = ?', an_interest)
Run Code Online (Sandbox Code Playgroud)

但是,我如何找到有多个兴趣的用户?当然,如果我这样做

UserProfile.joins(:interests).where('interests.id = ?', an_interest).where('interests.id = ?', another_interest)
Run Code Online (Sandbox Code Playgroud)

我总是得到一个空结果,因为在连接之后,没有行可以同时拥有interest.id = an_interest和interest.id = another_interest.

ActiveRecord中有没有办法表达"我想要有2个(指定)兴趣的用户列表?

更新(解决方案)这是我提出的第一个工作版本,感谢Omar Qureshi

    specified_interests.each_with_index do |i, idx|
      main_join_clause = "interests_#{idx}.user_profile_id = user_profiles.id"
      join_clause = sanitize_sql_array ["inner join interests_user_profiles interests_#{idx} on
                    (#{main_join_clause} and interests_#{idx}.interest_id = ?)", i]

      relation = relation.joins(join_clause)
    end
Run Code Online (Sandbox Code Playgroud)

activerecord join ruby-on-rails-3

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