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

 

感謝大牛們


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM