rank points player_id quiz_id
1 88 1 40
2 80 3 40
3 30 3 41
4 20 1 41
从以下查询中获取此输出:
SELECT m.rank,
m.scorer AS points,
m.player_id
FROM
( SELECT d.player_id,
d.scorer, @rownum := @rownum + 1 AS rank
FROM
( SELECT t.player_id,
SUM(t.score) AS scorer
FROM answers t
JOIN PROFILE ON profile.player_id = t.player_id
JOIN quiz ON t.quiz_id = quiz.id
WHERE t.is_active = 1
AND quiz.contest_id = 1
AND profile.signin_source_id != 1
AND profile.is_active = 1
AND t.quiz_id IN (1,
2)
GROUP BY t.player_id
ORDER BY scorer DESC, t.created_utc ASC) d,
(SELECT @rownum := 0) r) m
WHERE m.scorer > 0
但是,我想要的输出是每个级别的等级。
rank points player_id quiz_id
1 88 1 40
2 80 3 40
1 30 3 41
2 20 1 41
我遵循了这些:
Emoji_Component
Emoji-data designation
How to perform grouped ranking in MySQL
但是无法获得所需的输出。任何建议或帮助,表示赞赏。
答案 0 :(得分:4)
尝试此查询,这是更简单的IMO:
select @quiz_id_lag := 0, @rank := 1;
select rank, points, player_id, quiz_id from (
select points,
player_id,
case when @quiz_id_lag = quiz_id then @rank := @rank + 1 else @rank := 1 end rank,
@quiz_id_lag,
@quiz_id_lag := quiz_id,
quiz_id
from tbl
order by quiz_id, points desc
) a;
要将其合并到您的查询中,请尝试:
SELECT @quiz_id_lag := 0, @rank := 1;
SELECT rank,
scorer AS points,
player_id
FROM (
SELECT quiz_id,
player_id,
scorer,
CASE WHEN @quiz_id_lag = quiz_id THEN @rank := @rank + 1 ELSE @rank := 1 END rank,
@quiz_id_lag := quiz_id,
quiz_id
FROM (
SELECT t.player_id,
SUM(t.score) AS scorer,
t.quiz_id
FROM answers t
JOIN PROFILE ON profile.player_id = t.player_id
JOIN quiz ON t.quiz_id = quiz.id
WHERE t.is_active = 1 AND quiz.contest_id = 1 AND profile.signin_source_id != 1
AND profile.is_active = 1 AND t.quiz_id IN (1, 2)
GROUP BY t.player_id
) d
WHERE scorer > 0
ORDER BY quiz_id, scorer DESC
) m
答案 1 :(得分:3)
最终获得所需的结果,并以查询结束,以便针对级别进行适当的排名:
SELECT m.rank,m.scorer AS points,m.player_id, m.quiz_id FROM (
SELECT d.player_id,d.scorer,
@rownum:= CASE WHEN @quiz_id <> d.quiz_id THEN 1 ELSE @rownum+1 END as rank,
@quiz_id:= d.quiz_id as quiz_id FROM
(SELECT @rownum := 1) r,
(SELECT @quiz_id := 0) c,(
SELECT t.player_id,SUM(t.score) as scorer, t.quiz_id
FROM answers t JOIN profile ON
profile.player_id = t.player_id
JOIN quiz ON t.quiz_id = quiz.id
WHERE t.is_active = 1 AND quiz.contest_id = 2 AND
profile.signin_source_id != 1 AND profile.is_active = 1
GROUP BY t.player_id,t.quiz_id
ORDER BY quiz_id DESC,scorer DESC, t.created_utc ASC) d
) m
WHERE m.scorer > 0 ORDER BY quiz_id
这将为特定组的所有级别提供整个结果集,如果要从特定组获取特定级别的排名,请添加
AND t.quiz_id IN (1,2)
感谢所有参加的人!
答案 2 :(得分:3)
尝试一下
SELECT m.rank,m.scorer AS points,m.player_id, m.quiz_id
FROM (
SELECT d.player_id,d.quiz_id, d.scorer,
@cur:= IF(quiz_id=@id, @cur+1, 1) AS rank,
@id := quiz_id
FROM (
SELECT t.player_id, quiz.id as quiz_id, SUM(t.score) as scorer
FROM answers t JOIN profile ON profile.player_id = t.player_id
JOIN quiz ON t.quiz_id = quize.id
WHERE t.is_active = 1 AND quiz.contest_id = 1
AND profile.signin_source_id != 1 AND profile.is_active = 1
AND t.quiz_id IN (1,2)
GROUP BY t.player_id, quiz.id
ORDER BY scorer DESC
) d, (SELECT @id:=(SELECT MIN(id) FROM quiz), @cur:=0) AS init
order by d.quiz_id, d.scorer desc) m
WHERE m.scorer > 0