lawzk 发表于 2012-11-1 21:04:04

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


大家有什么好的方法吗。希望能得到帮助。

jimlong 发表于 2012-11-2 23:57:21

我使用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

lawzk 发表于 2012-11-6 20:19:16

感觉建临时表行不能。数据是每天时时显示的。建临时表开销太大了吧

hzwuyu 发表于 2012-11-20 00:26:02

两个方法间隔日期表,每天的日期数据都有,join过去~
或者像你原来那样选出数据来,自己在php里组合这些数据,

ichou 发表于 2012-12-10 21:14:08

用视图
页: [1]
查看完整版本: 讨论一个mysql的问题,希望高手进。