【发布时间】:2014-01-29 17:43:36
【问题描述】:
我正在使用 HourlyMetrics 编译一些网站统计数据,发现了一些奇怪的东西。
这是我本地开发环境最近 24 小时的统计数据。
irb(main):017:0> HourlyMetric.order('`to` DESC').limit(24).map(&:value)
HourlyMetric Load (2.0ms) SELECT `hourly_metrics`.* FROM `hourly_metrics` ORDER BY `to` DESC LIMIT 24
=> [0, 0, 0, 0, 10, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
我只是想要总数,但我暂时忘记了语法并尝试了两种不同的方法:
irb(main):016:0> HourlyMetric.order('`to` DESC').limit(24).sum(&:value)
HourlyMetric Load (2.3ms) SELECT `hourly_metrics`.* FROM `hourly_metrics` ORDER BY `to` DESC LIMIT 24
=> 13
irb(main):018:0> HourlyMetric.order('`to` DESC').limit(24).sum(:value)
(1.3ms) SELECT SUM(`hourly_metrics`.`value`) AS sum_id FROM `hourly_metrics` LIMIT 24
=> 21
似乎sum(:value) 正在生成21,因为这是HourlyMetrics 中所有 记录的总和。所以我知道它来自哪里,但是有人可以帮我理解为什么在我使用limit 范围时sum(:value) 没有范围吗?
【问题讨论】:
-
这很奇怪。我在 ruby 1.9.3 / Rails 3.2.13 上遇到了同样的故障。
User.limit(1).sum(:id)总是返回相同的(错误的)数字 -
@MrYoshiji 这是因为 SQL 的工作方式。
User.limit(1).sum(:id)将生成 SQLselect sum('id') from users limit 1并且作用域limit 1在此处正确应用于聚合函数sum的结果。仅仅因为它在 ruby 代码中以一种顺序出现并不意味着操作在 SQL 中以相同的顺序执行。 -
哦,我现在看到了...谢谢@mcfinnigan!
标签: mysql sql ruby-on-rails ruby