1. 程式人生 > >mysql查詢例項(查詢玩家充值後第一筆購買的東西)

mysql查詢例項(查詢玩家充值後第一筆購買的東西)

查詢玩家充值後第一筆購買的東西

這個查詢初看比較棘手,仔細分析之後發現有比較巧妙的方式解決。
* 充值表 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)