2016-11-29 92 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 –