Mysql:如何为排名列表选择过去24小时的前10位用户(并避免多个用户条目)

时间:2011-09-15 14:44:51

标签: mysql distinct

我想列出过去24小时内前10位用户的最高WPM(每分钟字数)值。如果用户有多个高分,则只应显示最高分。我到目前为止:

SELECT results.*, users.username 
FROM results 
JOIN users 
ON (results.user_id = users.id) 
WHERE results.user_id != 0 AND results.created >= DATE_SUB(NOW(),INTERVAL 24 HOUR) 
GROUP BY results.user_id 
ORDER BY wpm DESC LIMIT 10

我的问题是,我的代码没有获取最高值。例如:

用户x 有2个高分,但不是为该用户选择wpm最高的行,而是选择具有较低值的行。如果我使用“MAX(results.wpm)”,我获得最高的wpm。这没关系,但我也需要这一行的击键。我的问题是,即使我获取了正确的用户,我也没有收到该用户的正确行(使用户达到前10位的行)。

这是结果表:

  

id | user_id | wpm |击键| count_correct_words |   count_wrong_words |创建

2 个答案:

答案 0 :(得分:1)

(编辑答案,因为我们不能在子查询中使用LIMIT)

这是另一次尝试......

SELECT users.username, R1.* 
FROM users 
JOIN results R1 ON users.userId = R1.userId 
JOIN (SELECT userId, MAX(wpm) AS wpm FROM results GROUP BY userId) R2 ON R2.wpm = R1.wpm AND R2.userId = R1.userId
WHERE R1.user_id != 0 AND R1.created >= DATE_SUB(NOW(),INTERVAL 24 HOUR)
ORDER BY R1.wpm DESC LIMIT 10;

我们使用max()首先隔离每个user_id的最大wpm,然后使用此子集将Results表连接到内部以获取完整的行信息。

答案 1 :(得分:0)

感谢Oceanic,我认为你的子查询方法给了我一个工作的想法:

问题是,GROUP BY选择了聚合的第一列(?),我现在使用子查询首先按wpm对结果进行排序,并使用此“tmp表”进行操作

SELECT t1.*, users.username
FROM (SELECT results.* FROM results WHERE results.user_id != 0 AND results.created >= DATE_SUB(NOW(),INTERVAL 24 HOUR) ORDER BY wpm DESC) t1
JOIN users ON (t1.user_id = users.id)
GROUP BY t1.user_id
ORDER BY wpm DESC
LIMIT 10

这似乎工作正常。