5.mysql group by(不同的字段) 查询出来的数据不一样剖析

desc tb_pushlog_20151201;
id	int(10)	NO	PRI		auto_increment
imei	varchar(40)	NO	MUL		
imsi	varchar(25)	NO			
pushtime	datetime	NO		0000-00-00 00:00:00	
ruleid	int(11)	YES	MUL	0	
channelid	int(11)	YES		0	
cityid	int(11)	YES		0	
nexttime	int(11)	YES		0	
retention	int(11)	YES		0	
url	varchar(200)	YES			
backupurl	varchar(200)	YES			
type	char(1)	YES			
resultnum	int(2)	YES	MUL	99	
resultstr	varchar(400)	YES			

表tb_pushlog_20151201是统计一天内对用户push广告的情况:

select count(DISTINCT imei) from tb_pushlog_20151201 where  ruleid = 510 ;-- 457205

select sum(v.sums) from (select count(DISTINCT imei) as sums from tb_pushlog_20151201 where  ruleid = 510 group by channelid ) as v; -- 669319

select sum(v.sums) from (select count(DISTINCT imei) as sums from tb_pushlog_20151201 where  ruleid = 510 group by cityid ) as v; -- < 669319


第一条sql语句查询广告词为510的去重imei之后的用户数为457205条记录v1。

第二条sql语句,根据渠道号进行分组,同样是查询广告词为510 去重imei之后的用户数 669319条记录v2。

第三条sql语句,根据国家进行分组,同样是查询广告词为510 去重imei之后的用户数v3。
但是结果是 有v1<v3<v2 因为有可能这样的记录:

ffffffff-8831-1ffd-f323-b97d1c49c871 100051 china

ffffffff-8831-1ffd-f323-b97d1c49c871 100021 china

ffffffff-8831-1ffd-f323-b97d1c49c871 100256 china

ffffffff-8831-1ffd-f323-b97d1c49c871 100256 en

这样的结果是非常有可能的(根据实际查询结果),因此第1种情况,这4条记录只算1条记录,第2种情况对channelid分组,查询出来的有4条记录,第3种情况对国家分组,查询出来的是2条记录。



结论:在做数据报表时,根据需求要对不同的字段进行分组,统计出来的数据和 有可能 不一样,这样就要知道如果去分析。

你可能感兴趣的:(5.mysql group by(不同的字段) 查询出来的数据不一样剖析)