我想列出过去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 |创建
答案 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
这似乎工作正常。