3

私はこのポイントテーブルを持っています:

===========================================
フィールド : タイプ
===========================================
ID int(11)
user_id int(11)
値 int(11)
type enum('add','subtract')
タイムスタンプ int(11)
===========================================

基本的に、このテーブルにはユーザー ポイントのレコードが格納されます。

ここで私の質問は次のとおりです。合計ポイントが最も高い上位 10 人のユーザーを取得するにはどうすればよいですか?

注:スキーマを変更するように言われました。「タイプ」フィールドを削除し、「値」フィールドに正と負の値を入力してください。現在のスキーマを使用して目的のクエリを実行できるかどうかを知りたいだけです。

前もって感謝します

4

1 に答える 1

6

私はこのようなことを試してみます:

SELECT
  user_id,
  SUM( IF(`type`='add',+1,-1) * `value`) AS user_points
FROM Points
GROUP BY user_id
ORDER BY SUM( IF(`type`='add',+1,-1) * `value`) DESC
LIMIT 10

動作しているようです: http://sqlfiddle.com/#!2/dd207/1

別の方法として、より速いかもしれませんが、そうではないかもしれませんが、トリックはSUM(IF())内部クエリからパーツを移動することです:

http://sqlfiddle.com/#!2/dd207/9

SELECT
  user_id,
  SUM( IF(`type`='add',+1,-1) * `valuesum`)
FROM (
      SELECT
        user_id,
        `type`,
        SUM(`value`) AS `valuesum`
      FROM     Points
      GROUP BY user_id, `type`
     ) AS p
GROUP BY p.user_id
ORDER BY SUM( IF(`type`='add',+1,-1) * `valuesum`) DESC
LIMIT 10

おそらく両方のソリューションで、すべてを要約するために完全なテーブル スキャンを実行する必要があるため、この状況は、賢明な非正規化 (たとえば、別のテーブルでユーザーごとの合計を収集する) の適切な候補となる可能性があります。

于 2012-06-22T20:34:31.693 に答える