现有两张表
1.player表(playerid,gameid,imei,createtime)(玩家注册表)(playerid唯一,每个playerid对应一个IMEI,但是一个IMEI可能对应多个playerid)
2.playerbehavior表(playerid,gameid,acttime)(玩家登陆行为表)(acttime就是年月日,当天可能多次登陆)
现在我想查询的思路就是:player表中当天(1月29日)注册的玩家中IMEI独立的玩家,在登陆行为表中第二天(1月30日),有登陆行为的用户总共有多少人
PS:有可能多个playerid用户的IMEI是一样的,独立IMEI玩家就是IMEI一样的算作是同一个玩家:playerid=23,IMEI=123456,但是此玩家还有个playerid=24,IMEI=123456的账号,这两个账号都在第二天登陆了,但是只计算一个次日登陆数统计
如何写sql语句,求帮助。
假设统计日期为stat_dt(date类型),playerids代表imei下登陆的所有的id
方案一
`select imei,group_concat(playerid) from playerids as p
inner join playerbehavior as pb on pb.playerid=p.playerid and pb.acttime=date_add(stat_dt,interval 1 day)
where p.createtime>=stat_dt and p.createtimegroup by imei order by null;`
方案二
`select imei,group_concat(p.playerid) from playerids as p
inner join (select playerid from playerbehavior where acttime=date_add(stat_dt,interval 1 day)) as tb
on tb.playerid=p.playerid
where p.createtime>=stat_dtm and p.createtimegroup by imei order by null;`
两种方案的区别在于playerbehavior此表每天的数据量,由于方案二使用了临时表,虽然join的数量小了,但无法使用索引,不一定比方案一效率高,同时还要考虑playerbehavior索引
根据实际情况综合考虑
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。