鉴于下表:
| id | user_id | score | date |
|----|---------|-------|------------|
| 1 | 1 | 1 | 2017-08-31 |
| 2 | 1 | 1 | 2017-09-01 |
| 3 | 2 | 2 | 2017-09-01 |
| 4 | 1 | 2 | 2017-09-02 |
| 5 | 2 | 2 | 2017-09-02 |
| 6 | 3 | 1 | 2017-09-02 |
需要找到任何给定日期具有最高分数的user_ids(可能有多个),所以我正在尝试:
SELECT s1.user_id
FROM (
SELECT max(score) as max, user_id, date
FROM scores
) AS s2
INNER JOIN scores as s1
ON s1.date = '2017-08-31'
AND s1.score = s2.max
查询在最后2个日期正确返回,但在第一个日期('2107-08-31')返回0记录,它应该返回1的分数
为什么第一个日期不能正确返回和/或是否有更优雅的方式来编写此查询?
这是最接近工作的查询版本,但只有一个测试分数时它不起作用。我不明白我如何在聚合中不使用GROUP BY子句。
SELECT s1.user_id
FROM (
SELECT max(score) as max, user_id, date
FROM scores
) AS s2
INNER JOIN scores as s1
ON s1.date = :date
AND s1.score = s2.max
答案 0 :(得分:2)
正确的查询选项是:
SELECT user_id
FROM scores
WHERE score = (SELECT MAX(score) FROM scores WHERE date = '2017-08-01')
请注意,查询的一个问题(可能是您的问题)是子查询中的user_id和日期与包含MAX(得分)的行无关,因为您没有任何" group by"强制分组的条款