1

我正在制作一个步行马拉松轨道应用程序。每个步行者都由承诺每圈最高金额的人赞助。

我有一个名为的表,其中包含、和sponsorships列。我想编写一个 SQL 查询来确定步行者筹集了多少钱。walker_idamount_per_lapmax_amount

还有一个walkers包含idnamelaps列的表。

我知道这不是有效的 SQL,但我想要这样的东西,但不知道最好的方法。可以在执行查询之前提供 walker_id 和 laps。

选择总和(MIN(圈数 * 赞助商.amount_per_lap,赞助商.max_amount))从赞助商那里赞助商.walker_id = 1;

我在rails中制作这个,所以我试图弄清楚如何在Arel中做这样的事情,但无法弄清楚。

任何帮助将不胜感激。

编辑:澄清walkers表格。

Edit2:在伪代码中意外地有 max 而不是 min

4

2 回答 2

2

我认为您正在寻找的 SQL 是这样的:

select w.id, w.name, sum(least(w.laps * s.amount_per_lap, s.max_amount))
from walkers w
join sponsorships s on w.id = s.walker_id
group by w.id, w.name

least功能适用​​于您的“不超过max_amount”条件。既然您知道要选择什么,那么将其转换为 AR 对您来说应该是一件简单的事情;对于这样的事情,我倾向于直接使用 SQL。

于 2012-11-13T02:57:25.107 回答
1

我会尝试类似的东西:

class Sponsorship < ActiveRecord::Base
  name
  walker_id
  amount_per_lap
  max_amount

class Walker < ActiveRecord::Base
  name
  number_of_laps

walker_sum = 0
walker=walker.find(1) # For 1 walker.
walker.sponsorships.each do |sponsor| #
  walker_sum+= 
  min((sponsor.amount_per_lap * walker.number_of_laps), (sponsor.max_amount))
end
于 2012-11-13T01:38:48.300 回答