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
恰好是另一场游戏的最大值。@我现在检查我的答案