【发布时间】:2017-10-31 12:01:21
【问题描述】:
我有一个很简单的sql表(SCORES),只有一张表,没有JOIN:
userid score date
|1 1 2017-09-31
|1 1 2017-10-01
|2 2 2017-10-01
|1 2 2017-10-02
|2 2 2017-10-02
|3 1 2017-10-02
我想在给定的一天选择最高分的用户ID,所以
在 2017-09-31 ,它应该返回用户 ID 1
在 2017-10-01 ,它应该返回用户 ID 2(因为分数更高)
在 2017 年 10 月 2 日,它将返回用户 id 1 和 2(因为两个分数都是 2)
我试过这个 mysql 但不能正常工作:
SELECT user_id, MAX(score) AS hiscore, date
FROM scores
WHERE date =:date
GROUP BY user_id
ORDER BY hiscore DESC
我得到了这个:
在 2017-09-31 返回用户 ID 1(正确)
2017 年 10 月 1 日。返回 userid 1 和 userid 2 以及他们当天的最高分,这不是我想要的
知道怎么解决吗?
【问题讨论】:
-
我认为您的问题可能与 group by 子句有关,它返回每个组的 MAX 值,因此为什么对于 2017-10-01 它还返回用户 ID 1 的 1。你想要什么具体可能需要一些更高级的 sql
-
这个查询为我完成了工作
SELECT user_id, score AS hiscore, date FROM scores WHERE date = :date AND score IN ( SELECT MAX(score) FROM scores WHERE date = :date ) ORDER BY user_id DESC -
感谢工作
-
@knb 如果添加最大日期,则没有任何变化,查询中的问题是
max返回每个组的最大值(当您group by时)。由于他是按 user_id 分组的,因此他得到了 2/3 个组,每个组都有自己的max分数。 This 是MAX和GROUP BY一起工作的方式,你必须向下滚动一点到 MySQL MAX with GROUP BY 子句。