sql语句笔记-2014-2-24

A 表 (充值记录表) 有以下的字段  -------   hisreload 表

ID (递增) ,  ToMobile(冲往哪个手机号) ,  refID (guid , 表示一次事务)    ......

----------------------------------------------

B表(transactions)有以下字段

refID(与A表关联) , opTime (操作时间)           ........

--------------------------------------------

想实现的功能是: 查询 所有手机号及其最后一次充值记录 , 并对操作时间过滤, 例如去掉 最后一次充值在 2013-9-30 之前的

具体实现是 :

1 : 先找出每一个手机号对应的最后一次充值记录的ID

    SELECT ToMobile, MAX(ID) AS MaxID
    FROM HisReload
    GROUP BY ToMobile

2 : 因为第一步找出的 记录没有 refid , 所以再和 hisreload 表做一次 inner  join

SELECT tt.*
FROM HisReload tt
INNER JOIN
    (
    SELECT ToMobile, MAX(ID) AS MaxID
    FROM HisReload
    GROUP BY ToMobile
    ) groupedtt ON tt.ToMobile = groupedtt.ToMobile AND tt.ID = groupedtt.MaxID

这样得到的结果集就有 refid了, 取refid的目的是为了和transactions表连接 , 以得到 OpTime

3: 最后再把第二步得到的结果集 和 transaction 表  join ,并对optime做限制,整个sql语句是这样的

select b.toMobile 
from
(
SELECT tt.*
FROM HisReload tt
INNER JOIN
    (
    SELECT ToMobile, MAX(ID) AS MaxID
    FROM HisReload
    GROUP BY ToMobile
    ) groupedtt ON tt.ToMobile = groupedtt.ToMobile AND tt.ID = groupedtt.MaxID
) b inner join Transactions a on b.RefID=a.RefID
where a.OpTime<'2013-9-30'

得出的结果集是 所有 最后一次充值发生在 2013-9-30 之前的手机号。

原文地址:https://www.cnblogs.com/lthxk-yl/p/3564420.html