讨论一个mysql的问题,希望高手进。
我有一个表A。A里面字段为
userID 会员ID(索引)
date 日期(索引)
time 时间(索引)
count 使用次数
有一个表user。
userId会员ID(唯一索引)
name会员姓名
num 当天使用次数
numAll总使用次数
time 注册时间(索引)
date 注册日期(索引)
用户使用终端,使用的次数在终端本地也保存。每天将这统计的次数发到服务器。注意:一天只发1次,最多2次。
我采用的方案是:num字段保存当天的统计次数,如果不是同一天(可能是第二天,或第三天了),将num的次数转存到表A中。
现在表的数据如下:
user表
10000 小李 4 42012-10-1 xx:xx:xx2012-10-1
10001 小王 4 142012-10-2 xx:xx:xx2012-10-2
10002 小开 4 342012-10-3 xx:xx:xx2012-10-3
B表
100012012-10-1 02:02:022012-10-12
100012012-10-2 02:02:022012-10-22
100012012-10-3 02:02:022012-10-32
100012012-10-10 02:02:022012-10-102
100012012-10-20 02:02:022012-10-202
现在我要统计:
30天内的注册用户和老用户
显示的表结构如下:(如果今天是2012-11-1)
日期 注册用户 老用户
2012-11-1
2012-10-31
2012-10-30
即日期是从今天开始计算,每一天都有。如果那一天没有注册用户,那么那一栏中对应的注册用户数为0
请问我该如何实现这功能?
我目前的解决方案是:通过PHP循环的方式。假如30天内的情况,我就循环30次。第一次都通过SQL语句,结合计算的当天日期来读取数据。虽然实现功能,但我想,如果数据量大的情况下,比如100万或500万数据,这样的效率岂不是太低了。
如果用一个sql,比如:
下面是统计注册用户。
SELECT count(userId),date FROM user WHERE date > DATE_SUB(CURDATE(),INTERVAL 30 DAY) group by date
这样,如果那天没有注册用户,那么那一天的日期就不会显示。比如2012-10-1有注册用户。2012-10-2号没有人注册。2012-10-3号有人注册了。那么用上面的sql,就会显示:
2012-10-1
2012-10-3
而2012-10-2号就没有这一行了。
大家有什么好的方法吗。希望能得到帮助。
我使用MSSQL得多,对MYSQL不熟悉,但是应该思路是通用吧
1、建立临时表#temp,记录最最近30天的日期
就一个字段 ShowDate datetime
2、使用join right语句,以日期的临时表为主体
select t.ShowDatefrom #temp a join left
(
SELECT count(userId),date FROM user WHERE date > DATE_SUB(CURDATE(),INTERVAL 30 DAY) group by date
) b
on datediff(day,a.ShowDate,b.Date)=0 感觉建临时表行不能。数据是每天时时显示的。建临时表开销太大了吧 两个方法间隔日期表,每天的日期数据都有,join过去~
或者像你原来那样选出数据来,自己在php里组合这些数据, 用视图
页:
[1]