我有一个琐事游戏,我想奖励2个事件的用户:
1)正确回答
2)将问题发送到题库
我想要查询特定球员的得分和排名,我使用以下查询:
SELECT (correct*10+sent*30) AS score, @rank:=@rank+1 AS rank
FROM ( trivia_players
JOIN ( SELECT COUNT(*) AS sent, senderid
FROM trivia_questions
WHERE senderid='$userid'
) a
ON trivia_players.userid=a.senderid
)
ORDER BY score DESC如果玩家在两个表中,也就是回答正确并发送了一个问题,它就会起作用。但是,如果玩家没有发送问题,它就不起作用
你知道如何修复这个查询吗?($userid是给定的参数)
谢谢!
谢谢,汤姆!唯一的问题是排名不正确:
用户得分排名
58217 380 1
12354 80 3
32324 0 2
发布于 2010-09-08 00:43:38
我可能会这样做:
SELECT
user_id,
score,
rank
FROM
(
SELECT
TP.user_id,
(TP.correct * 10) + (COUNT(TQ.sender_id) * 30) AS score,
@rank:=@rank + 1 AS rank
FROM
Trivia_Players TP
LEFT OUTER JOIN Trivia_Questions TQ ON
TQ.sender_id = TP.user_id
GROUP BY
TP.user_id,
TP.correct
ORDER BY
score DESC
) AS SQ
WHERE
SQ.user_id = $user_id我不经常使用MySQL,所以它的语法可能并不完美。我认为您可以在MySQL中使用如下所示的子查询。假设MySQL通过只计算具有非空值的行来处理COUNT(),这应该是可行的。
关键是您对琐碎问题中的非空列进行计数,以便按用户对它们进行计数,并且您需要使用子查询,以便在约束到特定用户id之前获得每个人的排名。
发布于 2010-09-08 00:35:29
您是否尝试过使用RIGHT JOIN或LEFT JOIN?就在我头上!
https://stackoverflow.com/questions/3660606
复制相似问题