在ActiveRecord中,count和select(' DISTINCT COUNT(xxx)')之间有什么区别?

时间:2016-02-10 18:39:56

标签: ruby-on-rails ruby-on-rails-3 activerecord

我有两个相似的查询:

StoreQuery.group(:location).count(:name)

VS

StoreQuery.group(:location).select('DISTINCT COUNT(name)')

我期待结果完全相同,但他们并非如此。这两者有什么区别?

2 个答案:

答案 0 :(得分:1)

不同之处在于第一个查询计算所有名称,第二个查询计算唯一名称,忽略重复。如果您列出的名称不止一次,他们将返回不同的数字。

答案 1 :(得分:0)

使用此示例数据

id | name | location |
---+------+----------+ 
1  | NULL | US
2  | A    | UK
3  | A    | UK
4  | B    | AUS

让我们检查生成的查询结果

第一次查询

StoreQuery.group(:location).count(:name)

生成的查询:

SELECT location, COUNT(name) AS count FROM store_queries GROUP BY location

结果:

{US => 0, UK => 2, AUS => 1}

第二次查询

StoreQuery.group(:location).select('DISTINCT COUNT(name)')

生成的查询:

SELECT DISTINCT COUNT(name) FROM store_queries GROUP BY location

结果:

ActiveRecord::Relation [StoreQuery count: 0, StoreQuery count: 1, StoreQuery count: 1]
# Mean {US => 0, UK => 1, AUS => 1}

所以差异将是:

                 |1st query | 2nd query |
                 |----------+-----------+
# returned fields|    2     |    1      |
     distinction |    no    |    yes    |

顺便说一下,rails支持这个:

StoreQuery.group(:location).count(:name, distinct: true)