日光荏苒,我也负责mysql数据库的事情了。其实一点都不想做。
1. mysql的日期比较。
比如要查看或比较某个时间点 或者时间区间的数据,就要用到时间的比较。 一般mysql里字段的类型是 datetime。
datetime ,如果直接写<='2016-01-27 00:00:00' 进行比较 会造成少数据的问题。所以建议用unix_timestamp.
unix_timestamp(create_time) > unix_timestamp('2016-01-25 23:59:59') and unix_timestamp(create_time) < unix_timestamp('2016-01-26 23:59:59');
2.select a,b,count(b) from test where create_time >=CURDATE() group by a,b;
test 表里的 a,b 两列。 a代表用户, b代表事件,就是 用户a进行了事件b的次数。事件b ,分为 b1,b2,b3,。。
这个时候出来的结果是,仅仅显示事件不为0的条目。。
客户需要的是,即使事件bn 没有做过,也显示 a bn 0.
想到的是 都是建立temp表, test_temp
方法一, 用left jion,但表test_temp 有2列,(用户An,事件Bn) 要把用户A 对应所有的事件刷一遍。 a,b1; a,b2;......
然后查询语句为:
select a.task_org,a.task_status,count(b.task_status)
from test_temp a
left join test b on a.task_status =b.task_status and a.task_org=b.task_org
and b.create_time >=CURDATE()
group by a.task_org,a.task_status;
方法二: 只用1列 建立test_temp;
select task_org,task_status,sum(num) from (
select b.task_org,a.task_status,(case when a.task_status=b.task_status then num else 0 end) as num
from (select distinct task_status from test_temp ) a,
(select task_status,task_org,count(task_status) as num fromtest where unix_timestamp(create_time) > unix_timestamp('2016-01-27 00:00:00') and unix_timestamp(create_time) < unix_timestamp('2016-01-27 10:00:00') group by task_status,task_org) b) mn
group by task_org,task_status
;