【发布时间】:2016-02-10 18:39:55
【问题描述】:
我有两个相似的查询:
StoreQuery.group(:location).count(:name)
对
StoreQuery.group(:location).select('DISTINCT COUNT(name)')
我原以为结果会完全一样,但事实并非如此。两者有什么区别?
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-3 activerecord
我有两个相似的查询:
StoreQuery.group(:location).count(:name)
对
StoreQuery.group(:location).select('DISTINCT COUNT(name)')
我原以为结果会完全一样,但事实并非如此。两者有什么区别?
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-3 activerecord
不同之处在于第一个查询计算所有名称,第二个查询计算唯一名称,忽略重复。如果您多次列出某些名称,它们将返回不同的数字。
【讨论】:
有了这个样本数据
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)
【讨论】: