phpchandler 2013-05-03
项目需要查询游戏用户的流失用户,对于流失用户的定义为:当天登陆,之后三天未登录的用户视为流失用户,目前有数据表login_info分别存储了用户id,登陆时间(int11)。
最简单的实现方式:SELECTDISTINCTuidfromlogin_infoWHERElogin_timebetween$time1['begin']AND$time1['end']
anduidnotin(selectDISTINCTuidfromlogin_infowherelogin_timebetween$time2['begin']and$time2['end'])其中的$time1存储为一天的时间起止$time2存储为流失的时间范围(这里是三天),但是实际当中查询速度相当慢。
群里找了个高手,给出了另外一种解决办法,最终sql如下:
selectuidfrom(selectuid,MAX(login_time)asmax,MIN(login_time)asminFROMlogin_infowherelogin_timebetween1361721600and1362067199GROUPBYuid)asA
wheremaxbetween1361721600AND1361807999
查询时间大大缩短,不得不佩服高手啊!!!具体就不做解释了