0

I have a User model and an Item model. I want to rank users according to the value of the items they have. I want to do the equivalent of this query:

SELECT rank() OVER (ORDER BY grand_total DESC), u.*, grand_total
FROM users AS u
JOIN
(SELECT user_id, SUM(amount) AS grand_total FROM items WHERE EXTRACT(YEAR FROM sold_at)='2012' GROUP BY user_id) AS i
ON u.id = i.user_id;

Specifically, I don't know how to join on my select.

4

1 回答 1

1

鉴于您描述的问题,我将这样编写查询:

select users.*, sum(items.amount) as rank
  from users
  join items on items.user_id = users.id
  group by users.id
  order by rank desc;

这将转化为 AREL:

User.select('users.*, sum(items.amount) as rank').joins('join items on items.user_id = users.id').group('users.id').order('rank desc')

这有一个方便的副作用,您可以调用.rank生成的 User 对象并从查询中获取排名列的值,以防您需要显示它。

你的情况有什么我在这里没有掌握的吗,或者这会起作用吗?

于 2012-09-21T20:06:04.950 回答