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
素晴らしい!ありがとう!しかしもう1つ質問があります。これを拡張して列を追加するにはどうすればいいですか?例えば。私はこれを行う(問題の更新)が、私は約1 600 000レコード(1129)になる – Vertisan
おそらく内側の 'ORDER BY'は、オプティマイザによって無視されます。どのバージョンを実行していますか? 'EXPLAIN EXTENDED SELECT ...とは何か?警告を表示;と言う? –
@Vertisan。 。 。これを追加の列に拡張することができます。実際には、サブクエリに列を追加するだけで済みます。それ以上のものを意味するならば、サンプルデータと望ましい結果で別の質問をする必要があります。 –