mysql查詢例項(查詢玩家充值後第一筆購買的東西)
阿新 • • 發佈:2019-02-09
查詢玩家充值後第一筆購買的東西
這個查詢初看比較棘手,仔細分析之後發現有比較巧妙的方式解決。
* 充值表 rechange
uid | date_time | count |
---|---|---|
10086 | 2 | 2 |
10086 | 5 | 3 |
10086 | 7 | 4 |
* 購買表 mall_flow
uid | date_time | item_id |
---|---|---|
10086 | 5 | 1001 |
10086 | 8 | 1002 |
10086 | 9 | 1001 |
約束:充值時間應<=購買時間。
解法:
分析:如果我們將兩個時間放在一起排序,離一次充值最近的購買和離一次購買最近的充值都有可能滿足需求,那麼當兩者求交集就是所求的最終結構
離充值最近的購買
select a.date_time as x,min(b.date_time) as y from rechange as a join mall_flow as b using(uid) where
a.date_time <= b.date_time group by a.date_time
x y
2 5
5 5
7 8
離購買最近的充值
select max(a.date_time) as x ,b.date_time as y from rechange as a join mall_flow as b using (uid) where
a.date_time <= b.date_time group by b.date_time
x y
5 5
7 8
7 9
合併兩者得到:
x y
5 5
7 8
select * from(
select a.date_time as x,min(b.date_time) as y from rechange as a join mall_flow as b using(uid) where
a.date_time <= b.date_time group by a.date_time
)as A join(
select max(a.date_time) as x ,b.date_time as y from rechange as a join mall_flow as b using(uid) where
a.date_time <= b.date_time group by b.date_time
)as B using(x,y)