Mysql中按某字段相同的值,只查询最新日期的记录

今天工作中遇到一点小难题,场景是在所有商家的所有会员的交易记录累计的那张表,只查询每个会员最新的那条记录,返回的是jsonArr

一开始,想到是的group by来让会员手机号去重,再循环所有已去重的手机号取最新的那一条limit 1 order date desc,这样能实现我的需求。

 

let ret = await this.model('tablename').field('ANY_VALUE(id), card_id, ANY_VALUE(total_fill), ANY_VALUE(create_at)').group('card_id').order('ANY_VALUE(create_at) desc').select()

  

但始终发现不优雅,然后在DDDM的stackoverflow上找到了更优雅的实现方法:

Sample -

ID   Name    Date        Marks    ..    ..  ..   
1     XY     4/3/2017     27
1     fv     4/3/2014     98
1     jk     4/3/2016     09
2     RF     4/12/2015    87
2     kk     4/3/2009     56
2     PP     4/3/2011     76
3     ee     4/3/2001     12
3     ppp    4/3/2003     09
3     lll    4/3/2011     23

The Answer should be

ID   Name    Date        Marks    ..    ..  ..   
1     XY     4/3/2017     27      
2     RF     4/12/2015    87
3     lll    4/3/2011     23

 

某大牛的方案:
SELECT tt.*
FROM myTable tt
INNER JOIN
    (SELECT ID, MAX(Date) AS MaxDateTime
    FROM myTable
    GROUP BY ID) groupedtt 
ON tt.ID = groupedtt.ID 
AND tt.Date = groupedtt.MaxDateTime
https://stackoverflow.com/questions/45381743/select-rows-in-sql-with-latest-date-for-each-id-repeated-multiple-times

相当完美,一条语句搞掂,就是有点复杂,看得晕头转向的

 

最后附上我follow的代码

SELECT tt.id, tt.merchant_id, tt.card_id, tt.create_at, tt.surplus_score FROM tablename AS tt INNER JOIN (SELECT card_id, MAX(create_at) AS MaxDateTime FROM tablename GROUP BY card_id) groupedtt ON tt.card_id = groupedtt.card_id AND tt.create_at = groupedtt.MaxDateTime

 

感谢大牛们

posted @ 2020-05-14 19:05  wuwo  阅读(2670)  评论(0编辑  收藏  举报