0

User モデルと Item モデルがあります。持っているアイテムの価値に応じてユーザーをランク付けしたい。このクエリと同等のことをしたい:

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;

具体的には、自分の選択に参加する方法がわかりません。

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 に答える