微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

mysql-Object.limit(x).sum(:value)忽略了limit(x)-为什么?

我正在使用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中所有记录的总和.所以我知道它的来历,但是有人可以帮助我理解为什么我使用限制范围时为什么sum(:value)不在范围内?

解决方法:

它是有作用域的,只是作用域是在合计值的结果之后应用的,并且由于合计跨越表中的所有行,因此它仅返回单行.

您的第二条语句大致类似于:

SELECT * FROM (SELECT SUM(value) from hourly_metrics) limit 24;

这就是为什么结果使您感到困惑的原因.

重申一下-汇总函数SUM返回1行,其范围为LIMIT 24

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐