Mysql 按字段和时间划分的SQL复杂组
我有这张桌子:Mysql 按字段和时间划分的SQL复杂组,mysql,sql,Mysql,Sql,我有这张桌子: id | game_id | value | create_time ------------------------------------- 1 1 100 1.1.2017 2 1 200 1.2.2017 3 2 34 1.1.2017 4 3 200 1.1.2017 5 1 100 1
id | game_id | value | create_time
-------------------------------------
1 1 100 1.1.2017
2 1 200 1.2.2017
3 2 34 1.1.2017
4 3 200 1.1.2017
5 1 100 1.3.2107
我想获得每个游戏id的所有最后记录
5 1 100 1.3.2017
3 2 34 1.1.2017
4 3 200 1.1.2017
如何使用SQL(MySql)实现这一点?您可以使用如下查询:
SELECT *
FROM table
WHERE id IN (SELECT MAX(id)
FROM (SELECT id, max(date)
FROM table
GROUP BY game_id) as s2
);
您需要一个嵌套查询来按游戏id查找上次创建时间:
select
id,
game_id,
value,
create_time
from
game
inner join (
select
game_id,
max(STR_TO_DATE(create_time, '%m.%d.%Y')) as max_create_time
from
game
group by
game_id
) as lastGame on
game.game_id = lastGame.game_id and
STR_TO_DATE(game.create_time, '%m.%d.%Y') = lastGame.max_create_time
这只需要通过
game\u id
进行简单的聚合,以查找最新的创建日期。但是,由于您将日期存储为文本,我们需要首先使用STR\u to\u DATE
将它们转换为真正的日期
SELECT t1.*
FROM yourTable t1
INNER JOIN
(
SELECT game_id, MAX(STR_TO_DATE(create_time, '%m.%d.%Y')) AS max_create_time
FROM yourTable
GROUP BY game_id
) t2
ON t1.game_id = t2.game_id AND
STR_TO_DATE(t1.create_time, '%m.%d.%Y') = t2.max_create_time;
请注意,我假设您的日期格式为month.day.year
。如果您确实使用的是day.month.year
,则必须稍微更改STR\u TO\u DATE
中的格式掩码
一般来说,请不要将日期存储为文本。从上面的查询中可以看出,这将使您的生活更加复杂。您尝试过什么吗?当然,我对SQL不是很在行。我试着在约会时按游戏id和max分组。但是无法获取其他数据。你真的用这种格式存储日期吗?1。将日期存储为日期。2.请参阅:最大值应在日期上。您没有指定“最后记录”的含义。。。我要编辑我的答案这可能会返回一条非最新记录,其
id
恰好是另一场游戏的最大值。@我现在检查我的答案