我有一个虚拟问题
桌面游戏日志
| id | game_id | score| user_id | created_at
|1 | 1 | 100 | 1 | 2015-01-01 00:00:00|
|2 | 1 | 200 | 2 | 2015-01-01 10:00:00|
|3 | 2 | 100 | 2 | 2015-01-01 00:00:00|
|4 | 2 | 500 | 1 | 2015-01-01 01:00:00|
|5 | 2 | 900 | 4 | 2015-01-01 03:00:00|
|X | 2 | 500 | 1 | 2015-01-02 02:00:00|
|Y | 3 | 600 | 1 | 2015-01-02 01:00:00|
我需要在 2015 年 1 月 1 日之前使用用户 ID 创建游戏评级 结果看起来像
| id | game_id | score| user_id | created_at
|2 | 1 | 200 | 2 | 2015-01-01 10:00:00|
|5 | 2 | 900 | 4 | 2015-01-01 03:00:00|
我尝试过类似的东西
SELECT p.id, p.score, p.game_id, p.user_id
FROM (
SELECT *
FROM game_log
WHERE game_log.score>0
AND game_log.created_at >="2015-01-01 00:00:00"
AND game_log.created_at <"2015-01-02 00:00:00"
ORDER BY score DESC ) AS p
GROUP BY p.game_id
ORDER BY score DESC ;
但是没有顺序就得到结果
谢谢!
最佳答案
MariaDB 会忽略子查询中没有 LIMIT
的 ORDER BY
。 Why is ORDER BY in a FROM Subquery Ignored? 。解决方法是在子查询中使用 LIMIT
,该值足够大而不会过滤结果。
您还可以在 WHERE 子句中使用带有 LIMIT 1
的相关子查询来仅获取每场比赛得分最高的行:
SELECT p.id, p.score, p.game_id, p.user_id
from game_log p
WHERE p.id = (
SELECT l.id
FROM game_log l
WHERE l.game_id = p.game_id
AND l.score > 0
AND l.created_at >= "2015-01-01 00:00:00"
AND l.created_at < "2015-01-02 00:00:00"
ORDER BY l.score DESC, l.id
LIMIT 1
)
ORDER BY p.score, p.game_id DESC ;
还有其他解决方案,您可以在 SO 上找到,这将解决您的问题。
关于mysql - 在 maria db(mysql) 中按顺序和分组进行选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36485072/