用户
 找回密码
 入住 CI 中国社区
搜索
查看: 3405|回复: 4
收起左侧

[数据库] 讨论一个mysql的问题,希望高手进。

[复制链接]
发表于 2012-11-1 21:04:04 | 显示全部楼层 |阅读模式
我有一个表A。

A里面字段为

userID 会员ID(索引)
date    日期(索引)
time    时间(索引)
count 使用次数

有一个表user。

userId  会员ID(唯一索引)
name  会员姓名
num   当天使用次数
numAll  总使用次数
time     注册时间(索引)
date    注册日期(索引)

用户使用终端,使用的次数在终端本地也保存。每天将这统计的次数发到服务器。注意:一天只发1次,最多2次。

我采用的方案是:num字段保存当天的统计次数,如果不是同一天(可能是第二天,或第三天了),将num的次数转存到表A中。

现在表的数据如下:

user表

10000   小李   4   4  2012-10-1 xx:xx:xx  2012-10-1
10001   小王   4   14  2012-10-2 xx:xx:xx  2012-10-2
10002   小开   4   34  2012-10-3 xx:xx:xx  2012-10-3

B表

10001  2012-10-1 02:02:02  2012-10-1  2
10001  2012-10-2 02:02:02  2012-10-2  2
10001  2012-10-3 02:02:02  2012-10-3  2
10001  2012-10-10 02:02:02  2012-10-10  2
10001  2012-10-20 02:02:02  2012-10-20  2

现在我要统计:

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号就没有这一行了。


大家有什么好的方法吗。希望能得到帮助。
发表于 2012-11-2 23:57:21 | 显示全部楼层
我使用MSSQL得多,对MYSQL不熟悉,但是应该思路是通用吧
1、建立临时表#temp,记录最最近30天的日期
就一个字段 ShowDate datetime
2、使用join right语句,以日期的临时表为主体
select t.ShowDate  from #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
 楼主| 发表于 2012-11-6 20:19:16 | 显示全部楼层
感觉建临时表行不能。数据是每天时时显示的。建临时表开销太大了吧
发表于 2012-11-20 00:26:02 | 显示全部楼层
两个方法间隔日期表,每天的日期数据都有,join过去~
或者像你原来那样选出数据来,自己在php里组合这些数据,
发表于 2012-12-10 21:14:08 | 显示全部楼层
用视图

本版积分规则