2017-01-04 8 views
0

私はランクシステムを作成しているので、すべてのユーザーのランク付け位置を設定する必要があります。
私はこれを実行します。sql - @curRow列に基づいて

SELECT @curRow := @curRow + 1 AS position, 
       Sum(point_user.amount) AS points 
FROM  users u 
JOIN  point_user ON u.id = point_user.user_id 
JOIN (SELECT @curRow := 0) r 
GROUP BY 
u.id 
ORDER BY 
position ASC 

をそして私は取得しています:

+----------+----------+ 
| position | points | 
+----------+----------+ 
|  1 | 86  | 
|  2 | 239  | 
|  3 | 45  | 
+----------+----------+ 

、どのように私はポイントに基づいて、行番号を設定することができますか?
万一は次のようになります - それはあなたの意図であると思われるので、

クエリで
+----------+----------+ 
| position | points | 
+----------+----------+ 
|  1 | 239  | 
|  2 | 86  | 
|  3 | 45  | 
+----------+----------+ 

UPDATE

SELECT (@curRow := @curRow + 1) as position, 
       points, 
       u2.id 
FROM (SELECT Sum(pu.amount) AS points 
     FROM users u JOIN 
      point_user pu 
      ON u.id = pu.user_id 
     GROUP BY u.id 
     ORDER BY points DESC 
) upu, users u2 
CROSS JOIN (
      SELECT @curRow := 0 
) params 
ORDER BY points DESC 

答えて

3

ORDER BY points DESCORDER BYを変更するのに十分であるかもしれません。

しかし、MySQLには変数とGROUP BYという既知の問題があります。解決策は単にサブクエリを使用することです:

SELECT (@curRow := @curRow + 1) as position, points 
FROM (SELECT Sum(pu.amount) AS points 
     FROM users u JOIN 
      point_user pu 
      ON u.id = pu.user_id 
     GROUP BY u.id 
     ORDER BY points DESC 
    ) upu CROSS JOIN 
    (SELECT @curRow := 0) params 
ORDER BY points DESC; 
+0

素晴らしい!ありがとう!しかしもう1つ質問があります。これを拡張して列を追加するにはどうすればいいですか?例えば。私はこれを行う(問題の更新)が、私は約1 600 000レコード(1129)になる – Vertisan

+0

おそらく内側の 'ORDER BY'は、オプティマイザによって無視されます。どのバージョンを実行していますか? 'EXPLAIN EXTENDED SELECT ...とは何か?警告を表示;と言う? –

+0

@Vertisan。 。 。これを追加の列に拡張することができます。実際には、サブクエリに列を追加するだけで済みます。それ以上のものを意味するならば、サンプルデータと望ましい結果で別の質問をする必要があります。 –

関連する問題