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

标签 mysql distinct

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

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 | keystrokes | count_correct_words | count_wrong_words | created

最佳答案

(编辑答案,因为我们不能在子查询中使用 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 表与该子集进行内部连接以获得完整的行信息。

关于Mysql:如何为排名列表选择最近 24 小时的前 10 名用户(并避免多个用户条目),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7432784/

相关文章:

MySQL 联合两个表,然后合并到匹配的第三个表中?

sql - 无法分隔 MySQL 查询中的不同 ID

sql - 如何更干净地将 sql 聚合函数与 distinct 结合起来?

php - 根据条件禁用按钮

mysql - 快速删除MySQL中的重复记录

javascript - 在嵌套的急切加载 Sequelize 查询中,仅获取一些属性

sql - 包含 SQL 列的结果的百分比

mysql - 如何在mysql中获得不同的结果?

c# - 在一个 SqlCe 命令中创建多个表不起作用

php - 获取属于团队的成员