繁体   English   中英

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

[英]MySQL selecting last row from group by two columns

我试图从选择中的每个组中获取最新的行,但稍微扭曲一下。

获取下表作为示例:

 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会给我想要的结果。

所以我需要以某种方式将id行添加到这个“组”机制中。 知道怎么做吗?

如果您选择哪一行并不重要,您可以按唯一行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

如果你用你的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;

(只需将id替换为created_at

但如果你没有“正常”身份证,我认为没有办法做到这一点......

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

岂不

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分组。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM