2016-11-29 411 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。

第一名獲得總數的70%,第二名--20%,第三名--10%。

如果用戶之間的平等正確答案,分數均勻分配(50/50,33/33/33 ...)。

SQL Fiddle

+0

如果您發佈的SQL的DML和DDL和如果你做的這將是非常非常有幫助[SQL小提琴](http://sqlfiddle.com) –

回答

2

你需要分解你想要什麼。

第一步:你想得到前3的分數。

SELECT nright 
FROM jackpot 
ORDER BY nright DESC 
LIMIT 3 

第2步:用戶ID誰得到這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 

第三步:點總量

SELECT COUNT(uid)*20 AS lot FROM jackpot 

第四步:等級和人數

這裏我們需要使用一個變量,就像你在php中一樣,你不能使用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 

5步:該地段分佈

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語法中有錯誤;檢查與您的MySQL服務器版本相對應的手冊,在'@rank:= 0'附近使用正確的語法。r GROUP BY nright,rank ORDER BY nright DESC LIMIT 3)AS'在第10行 – user1542894

+0

嗯,不應該j。 uid和j.nright是jackpot.uid和jackpot.nright?否則它會說'表格中沒有這樣的列'。 我試着改變它,但有錯誤:'操作數應該包含1列' – user1542894

+0

對不起。這就是爲什麼我不應該從我的工作站發佈任何遊戲者。 :D –