Sch*_*ems 9 ruby sql activerecord ruby-on-rails
我试图计算一年和一个月内创建的所有用户的数量,但以下似乎没有按预期工作.
User.group("YEAR(created_AT), MONTH(created_at)").
count("DISTINCT(id), YEAR(created_at), MONTH(created_at)")
Run Code Online (Sandbox Code Playgroud)
我正在寻找类似的东西
{2011 => {1 => 222, 2 => 333, 4 => 444, 5 => 667 ... }}
Run Code Online (Sandbox Code Playgroud)
但我得到了
{1 => 222, 2 => 333, 4 => 444, 5 => 667 ... }
Run Code Online (Sandbox Code Playgroud)
我错过了什么,或者ActiveRecord不能在一个查询中给我这个结果?
mu *_*ort 14
该count方法不像您认为的那样工作.你最终做到了这一点:
select count(distinct(id), year(created_at), month(created_at))
from users
group by year(created_at), month(created_at)
Run Code Online (Sandbox Code Playgroud)
那个SELECT子句非常狡猾但MySQL会以通常的草率方式让它通过.我想你想要这个查询:
select count(distinct(id)), year(created_at), month(created_at)
from users
group by year(created_at), month(created_at)
Run Code Online (Sandbox Code Playgroud)
我可能会直接select_all这样说:
a = User.connection.select_all(%q{
select count(distinct(id)) as c, year(created_at) as y, month(created_at) as m
from users
group by y, m
})
Run Code Online (Sandbox Code Playgroud)
或者你可以这样做:
a = User.connection.select_all(
User.select('count(distinct(id)) as c, year(created_at) as y, month(created_at) as m').
group('y, m')
)
Run Code Online (Sandbox Code Playgroud)
这些会给你一个数组a,哈希用c,y和m这样的键:
a = [
{ 'c' => '23', 'y' => '2010', 'm' => '11' },
{ 'c' => '1', 'y' => '2011', 'm' => '1' },
{ 'c' => '5', 'y' => '2011', 'm' => '3' },
{ 'c' => '2', 'y' => '2011', 'm' => '4' },
{ 'c' => '11', 'y' => '2011', 'm' => '8' }
]
Run Code Online (Sandbox Code Playgroud)
然后,您需要完成一些数据争用:
h = a.group_by { |x| x['y'] }.each_with_object({}) do |(y,v), h|
h[y.to_i] = Hash[v.map { |e| [e['m'].to_i, e['c'].to_i] }]
end
# {2010 => {11 => 23}, 2011 => {1 => 1, 3 => 5, 4 => 2, 8 => 11}}
Run Code Online (Sandbox Code Playgroud)