【问题标题】:Select Users with top score on given DATE [duplicate]选择在给定 DATE 得分最高的用户 [重复]
【发布时间】: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 分数。 ThisMAXGROUP BY 一起工作的方式,你必须向下滚动一点到 MySQL MAX with GROUP BY 子句

标签: php mysql


【解决方案1】:
SELECT Group_concat(user_id separator ','), score AS hiscore, date
FROM scores 
WHERE date =:date
and (score) in
                  (select max(score) from scores group by date)
;

【讨论】:

  • 不返回任何东西
  • date 提供什么?
  • 以字符串“2017-09-31”为例
  • date的数据类型是什么?
  • 它只是一个字符串
猜你喜欢
  • 1970-01-01
  • 2013-01-21
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 2021-02-06
  • 2021-02-19
  • 2021-06-08
  • 1970-01-01
相关资源
最近更新 更多