MySQL从组中选择最后一行两列

时间:2016-04-14 15:11:19

标签: mysql sql

我试图从select中的每个组中获取最新的行,但稍微有点扭曲。

获取下表:

 id , user_id , created_at          , balance 
 1  , 1       , 2016-01-01 01:01:01 , 1       
 2  , 1       , 2016-01-01 01:01:01 , 2       

你可以看到同一个用户的created_at值是相同的,问题是我不能依赖id字段,因为没有什么可以保证最大的id将是最后一个之一。

如果created_at字段不会重复,则以下查询将正常工作:

SELECT L.id
    , L.user_id
    , L.created_at
    , L.balance
FROM   log AS L
      JOIN
         (SELECT user_id
              , MAX(created_at) AS max_created_at
          FROM   log
          GROUP BY user_id) MAX_TIME ON L.user_id = MAX_TIME.user_id
                                  AND L.created_at = MAX_TIME.max_created_at;

但由于重复的created_at,它将返回两行。 所以我不能只依赖created_at字段,但我确信如果created_at是重复的,那么获取最大ID会给我想要的结果。

所以我需要在这个" group"中添加id行。机制。 知道怎么做吗?

3 个答案:

答案 0 :(得分:0)

如果您选择哪一行无关紧要,您可以按唯一行ID进行排序,只选择顶部1.如果您想要最后行,即行最大的唯一ID,您需要ORDER BY ... DESC

SELECT TOP 1
      L.id
    , L.user_id
    , L.created_at
    , L.balance
FROM   log AS L
      JOIN
         (SELECT user_id
              , MAX(created_at) AS max_created_at
          FROM   log
          GROUP BY user_id) MAX_TIME ON L.user_id = MAX_TIME.user_id
                                  AND L.created_at = MAX_TIME.max_created_at;
                                  ORDER BY L.id DESC

答案 1 :(得分:0)

如果你用你的ID创建了你的表作为auto_increment(我强烈推荐这种方式),最大的一行应该是最新的一行......

所以:

SELECT L.id
    , L.user_id
    , L.created_at
    , L.balance
FROM   log AS L
      JOIN
         (SELECT user_id
              , MAX(id) AS last
          FROM   log
          GROUP BY user_id) MAX_TIME ON L.user_id = MAX_TIME.user_id
                                  AND L.id = MAX_TIME.last;

(只需将created_at替换为id

但如果你没有"正常" ID,我认为没有办法做到这一点......

答案 2 :(得分:0)

为什么你真的需要自我加入?

岂不

SELECT L.id
, L.user_id
, L.created_at
, L.balance
FROM log AS L
GROUP BY L.user_id
ORDER BY L.created_at DESC, L.id DESC;

获得预期的行?

说明:首先进行排序,这样最新的日期时间已经在第一行。由于重复日期时间值的可能性,我们通过id添加另一个排序。现在,具有最新日期时间和最高ID的行将位于第一行,然后结果按用户ID分组。