Rails 4(Rails 4.2.2 / ruby 2.2.1)和PostgreSQL 9(PostgreSQL 9.4.4)发现了以下奇怪的行为。
请记住,没有聚合表达式的分组会有效地计算列中不同值的集合,以下明显相似的代码行会导致奇怪和奇怪的结果:
为什么:
Item.select( :color, :size ).distinct.count # ERROR
返回错误,而是:
Item.select( :color, :size ).distinct.count( :all ) # WRONG
Item.select( :color, :size ).distinct.count( :color, :size ) # WRONG
两者都返回错误的结果(如果有重复的记录具有相同的:color
和:size
值)?
为什么:
Item.select( :color, :size ).group( :color, :size ).count # ERROR
返回错误,而是:
Item.select( :color, :size ).group( :color, :size ).count( :all ).count
正确计算SELECT COUNT(DISTINCT (color, size)) FROM items
?
此外:
Item.group( :color, :size ) # ERROR
返回错误,正如预期的那样,因为带有GROUP BY
子句的查询只能在SELECT
列表中包含非聚合列引用,如果它们也出现在或在功能上依赖于, GROUP BY
条款。
但Rails允许以下内容:
Item.group( :color, :size ).count.count
也正确计算SELECT COUNT(DISTINCT (color, size)) FROM items
!