2016-11-29 22 views
0

私はテーブルjackpotを持っています。ユーザIDの場合はuid、正解の場合はnrightです。ランクの位置に基づいてスコアを計算する

私は正しい答えでユーザーを選択してランク付けすることができますが、次に何がありますか?

SELECT 
    a1.uid, 
    a1.nright, 
    COUNT(a2.nright) AS rank 
FROM 
    jackpot a1, 
    jackpot a2 
WHERE 
    a1.nright < a2.nright 
OR (
    a1.nright = a2.nright 
    AND a1.uid = a2.uid 
) 
GROUP BY 
    a1.uid, 
    a1.nright 
ORDER BY 
    a1.nright DESC, 
    a1.uid DESC 

私は、自分の位置に応じて各ユーザーに与えるべきポイントの量を計算する必要があります。

トップ3のユーザMAX nrightのみがポイントを受信します。

合計ポイント=ユーザー数* 20。

最初の位置は、2番目 - 20%、3番目 - 10%の合計の70%になります。

ユーザー間で正しい回答が等しい場合、ポイントは均等に分割されます(50/50、33/33/33 ...)。

SQL Fiddle

+0

あなたが作る場合、あなたはまた、あなたのSQLのDMLとDDLを投稿した場合それは本当に参考になります[SQL Fiddle](http://sqlfiddle.com) –

答えて

2

は、あなたが望むものを分解する必要があります。

第1ステップ:トップ3の得点が必要です。

SELECT nright 
FROM jackpot 
ORDER BY nright DESC 
LIMIT 3 

第2工程:この3つの最初のスコア

SELECT j.uid 
FROM jackpot j 
INNER JOIN (
    SELECT nright 
    FROM jackpot 
    ORDER BY nright DESC 
    LIMIT 3) AS t ON t.nright = j.nright 

3ステップ取得したユーザID:

SELECT COUNT(uid)*20 AS lot FROM jackpot 

第4ステップポイントの総量:ランクと人数

ここでは変数を使用する必要があります。これはset @var:= X;を使用できないため、Select @var:= Xを実行することです。この変数は集計関数のために機能しません。だから、これを実行する必要があります。

SELECT @rank := @rank+1 as rank,T1.nright,T1.nb,T1.lot 
FROM(
    SELECT nright, 
      COUNT(uid) as nb, 
     (SELECT COUNT(uid)*20 FROM jackpot) as lot 
    FROM jackpot 
    GROUP BY nright 
    ORDER BY nright DESC 
    LIMIT 3 
    )T1, (SELECT @rank:= 0) r 

第五ステップ:たくさんの分布

SELECT j.uid, 
    CASE 
    WHEN t.rank = 1 THEN (t.lot*0.7)/t.nb 
    WHEN t.rank = 2 THEN (t.lot*0.2)/t.nb 
    WHEN t.rank = 3 THEN (t.lot*0.1)/t.nb 
    END as lot 

FROM jackpot j 
INNER JOIN 
(SELECT @rank := @rank+1 as rank,T1.nright,T1.nb,T1.lot 
FROM(
    SELECT nright, 
      COUNT(uid) as nb, 
     (SELECT COUNT(uid)*20 FROM jackpot) as lot 
    FROM jackpot 
    GROUP BY nright 
    ORDER BY nright DESC 
    LIMIT 3 
    )T1, (SELECT @rank:= 0) r) t ON t.nright = j.nright 
+0

説明をありがとうが、次のエラーが表示されます。 SQL構文にエラーがあります。右側の構文が「@rank:= 0」の近くで使用するようにMySQLサーバのバージョンに対応するマニュアルをチェックしてください。r GROUP BY nright、rank ORDER BY nright DESC LIMIT 3)AS '10行目 – user1542894

+0

Hm、jはしないでください。 uidとj.nrightはjackpot.uidとjackpot.nrightですか?そうでなければ、 'テーブルにそのような列はありません'と言います。 私はそれを変更しようとしましたが、エラーが発生しました: 'オペランドは1列を含むべきです' – user1542894

+0

はい、申し訳ありません。これが私のワークステーションからアンサーを投稿してはならない理由です。 :D –

関連する問題