CREATE TABLE `asgard_share_records` (
`id` bigint(20) NOT NULL COMMENT '分享记录id',
`status` tinyint(3) unsigned NOT NULL DEFAULT '1' COMMENT '数据状态 1: 正常 0: 删除',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`user_id` bigint(20) DEFAULT NULL COMMENT '分享的用户id',
`link_url` varchar(255) DEFAULT NULL COMMENT '分享的链接地址',
`shared_day` varchar(10) NOT NULL DEFAULT '' COMMENT '分享当天',
`shared_hour` varchar(2) NOT NULL COMMENT '分享时刻',
PRIMARY KEY (`id`),
KEY `idx_shared_day` (`shared_day`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='分享记录';
表结构如上。分享记录表
select sum(if(shared_day =#{today},1,0)) sharedPeopleTodayCount,
sum(if(shared_day =#{yesterday},1,0)) sharedPeopleYesterdayCount,
sum(if(shared_day =#{today},1,0))/sum(if(shared_day =#{yesterday},1,0)) sharedPeopleIncreasePercent
from (
select
user_id,shared_day
from asgard_share_records
where user_id >0
and shared_day in (#{today},#{yesterday})
group by user_id,shared_day
) a
1、统计昨日和今日分享人数
2、采用sum if 行转列,方便收集数据。
但有一个问题。如果today 或者yesterday没有数据,则统计返回数据是null。使用sum统计如果没有数据可能是null !!!
select ifnull(sum(if(shared_day =#{today},1,0)),0) sharedPeopleTodayCount,
ifnull(sum(if(shared_day =#{yesterday},1,0)),0) sharedPeopleYesterdayCount,
ifnull(sum(if(shared_day =#{today},1,0))/sum(if(shared_day =#{yesterday},1,0)),0) sharedPeopleIncreasePercent
from (
select
user_id,shared_day
from asgard_share_records
where user_id >0
and shared_day in (#{today},#{yesterday})
group by user_id,shared_day
) a
加上ifnull,如果是null则返回0 优化sql,解决问题。