问答 / 1 / 18 / 创建于 6年前
公司项目,要求 按月统计 每个月所有用户消费金额与充值金额,并可以根据 月份 进行筛选。 原生SQL 也行。 可以给点建议吗?
做统计一般是做一个统计结果表,每天用定时任务重新统计数据,查的时候直接从统计结果表里取就行了。直接上 SQL 来统计不仅写起来麻烦、看起来不清晰,更重要的是慢。
可以新建一个表出来。
架构允许的话,上时序性数据库吧,可以满足了。
业界开源的 influxdb 好用,但是缺点就是集群不是开源的。
@半人间 已经是新的表了,一张消费记录表 ,记录了 user_id, type -- 充值还是消费;现在就是按 月份统计,和指定月份查询
把满足条件的所有数据都查询出来,然后用 php 来把数据处理成你想要的就行了,能用 php 处理的为什么要用 sql 去处理呢
这个都是先取出数据,然后在php中循环处理数组就好了。为什么要在mysql里面处理呢
一张天表,一张月表,一张年表,每天半夜统计到里面去。
按 leo 说的做准没错,新表记得加一个date字段方便统计
数据不多可以用 DATE_FORMAT 函数
DATE_FORMAT
SELECT SUM(`column`) FROM `table` WHERE DATE_FORMAT(`created_at`, '%Y-%m')='2019-09';
赞同 leo
这个常见做法,就是写个脚本 每天定时把前一天的结果汇总到一个新表中,这个新表就是聚合后的结果。然后查询的时候,如果需要当天的数据,查原表和新表进行组合。 比直接查明细表快很多。一年365天,10年才3000多条记录
目前也在做一个统计,不过统计后,没放进mysql,而是放进mongodb里面
刚好之前有个项目也是有统计的,做法跟楼上各位说的一样,定时任务分表,查询差不多就像这样,随便改了下你可以看看,哈哈哈
$query = DB::table('XXXX_per_month as a') ->select(DB::raw("XXXXXXXXXXXXXXXXXXXXXXXXXXXXX,DATE_FORMAT('created_at','%Y-%m') as date")) ->Join('users as b', 'a.user_id', '=', 'b.id') ->groupBy(DB::raw("date")) ->groupBy(DB::raw("b.username")); //条件筛选 某时间段内 if (!empty($start)) { $query->whereRaw('created_at>= ?', $start); } if (!empty($end)) { // } $data = $query->get();
@张三 我现在用的也是这个方法 :joy:
@leo 这个思路不错,但是现在的需求是支付宝支付流水通过excel或cvs导入数据库的,然后统计数据库的数据 :sob: 以后如果有新的需求在试试吧 ,也算是学到了,一种好的结果方式
@kani 这个也不错,学到了 ,谢谢
@xianyunyehe 谢谢你的建议,真实学道理不少,思路
既然 指定月份查询统计 都写了, 指定年份 之 统计所有月份 sql也写上吧,( 原生SQL 自行转换 ORM, field 为时间类型的数据库字段 --datetime 或 timestamp) SELECT DATE_FORMAT( field ,'%Y-%m') as MONTH, SUM( 需要统计的字段 ) FROM table WHERE DATE_FORMAT(field ,'%Y') = '2019' GROUP BY date_format(field , '%Y-%m');
欧了 :joy:
我要举报该,理由是:
高认可度评论:
做统计一般是做一个统计结果表,每天用定时任务重新统计数据,查的时候直接从统计结果表里取就行了。直接上 SQL 来统计不仅写起来麻烦、看起来不清晰,更重要的是慢。
可以新建一个表出来。
架构允许的话,上时序性数据库吧,可以满足了。
业界开源的 influxdb 好用,但是缺点就是集群不是开源的。
@半人间 已经是新的表了,一张消费记录表 ,记录了 user_id, type -- 充值还是消费;现在就是按 月份统计,和指定月份查询
把满足条件的所有数据都查询出来,然后用 php 来把数据处理成你想要的就行了,能用 php 处理的为什么要用 sql 去处理呢
这个都是先取出数据,然后在php中循环处理数组就好了。为什么要在mysql里面处理呢
做统计一般是做一个统计结果表,每天用定时任务重新统计数据,查的时候直接从统计结果表里取就行了。直接上 SQL 来统计不仅写起来麻烦、看起来不清晰,更重要的是慢。
一张天表,一张月表,一张年表,每天半夜统计到里面去。
按 leo 说的做准没错,新表记得加一个date字段方便统计
数据不多可以用
DATE_FORMAT函数赞同 leo
这个常见做法,就是写个脚本 每天定时把前一天的结果汇总到一个新表中,这个新表就是聚合后的结果。然后查询的时候,如果需要当天的数据,查原表和新表进行组合。 比直接查明细表快很多。一年365天,10年才3000多条记录
目前也在做一个统计,不过统计后,没放进mysql,而是放进mongodb里面
刚好之前有个项目也是有统计的,做法跟楼上各位说的一样,定时任务分表,查询差不多就像这样,随便改了下你可以看看,哈哈哈
@张三 我现在用的也是这个方法 :joy:
@leo 这个思路不错,但是现在的需求是支付宝支付流水通过excel或cvs导入数据库的,然后统计数据库的数据 :sob:
以后如果有新的需求在试试吧 ,也算是学到了,一种好的结果方式
@kani 这个也不错,学到了 ,谢谢
@xianyunyehe 谢谢你的建议,真实学道理不少,思路
既然 指定月份查询统计 都写了, 指定年份 之 统计所有月份 sql也写上吧,( 原生SQL 自行转换 ORM, field 为时间类型的数据库字段 --datetime 或 timestamp)
SELECT
DATE_FORMAT( field ,'%Y-%m') as MONTH,
SUM( 需要统计的字段 )
FROM
table
WHERE
DATE_FORMAT(field ,'%Y') = '2019'
GROUP BY
date_format(field , '%Y-%m');
欧了 :joy: