问答 / 1 / 27 / 创建于 8年前
给个参考:
User::whereRaw('left(`created_at`, 10)>="2017-10-13"')->get()
@施国鹏 谢谢您的指点,不明白的是您为什么要使用left()函数,不知道是否用 between 会更好一些呢
@Wanzj 参考而已,
@施国鹏 恩,谢谢啦
有更好的方法,我看了作者的视频的,但是忘了怎么写的,我晚点告诉你。
如果数据量大,实时统计是很难的,通常是每天凌晨去跑一下数据存起来,然后查的时候就直接查结果就行了
@欧阳逸 恩恩,好的,谢谢啦
@leo 对于那种不正常的 就像 (2017-10-13 , 2017-11-13)这种时间段的筛选数据,对数据怎么去做统计比较好呢
2017-11-16 14:24:37 是 datetime 类型,2017-11-16 是 date 类型,这两个类型指的是 MySQL 数据类型。这两个类型中,均可以使用 > 和 < 进行筛选,即:Article::where('created_at', '>', '2017-11-16 14:26:33')->get() 甚至直接拿 date 类型的数据去 datetime 字段筛选,都是支持的。
2017-11-16 14:24:37
2017-11-16
Article::where('created_at', '>', '2017-11-16 14:26:33')->get()
@johnlui 恩 了解,现在问题是,数据量大,用这种where('created_at', '>', '2017-11-16 14:26:33')这种查询的效率就会很低,所以有没有 可以统计这种没有规律的时间段内数据的 方法。
where('created_at', '>', '2017-11-16 14:26:33')
@Wanzj 数据量有多大,效率有多低?我帮你对症下药
@johnlui 恩恩,谢谢了, 我有个商品数据表,存的是各大商城每天商品的销量的,现在每天会向数据表插两百条商品的销量,现在差不多有八十万条数据。我需要做的是根据用户选择的时间段,去统计这段时间内的数据,然后合并相同品牌的数据且将销量相加,其实我现在就是用的您说的那种方式,但是我想偷懒一下,做一个统计表,这样就可以将一周的7条数据变成一条数据,一个月的30条数据也变成一条数据,这样会节省不少时间, 但是我遇到了一个问题:当用户选了 2017-01-25 - 2017-11-14这样一段时间的时候,我该怎么办呢 , @johnlui 非常感谢您上面给的提示,谢谢
2017-01-25
2017-11-14
这种非确定时间的统计只能实时来做,建议从优化数据库性能方向着手。
@johnlui 好的大哥,让我受益匪浅,谢谢啦
@Wanzj 还有一种办法,告诉产品经理这个不好做,让他找妥协的方案
@leo 哈哈,产品找来了 某某数据分析平台,说,人家的这个功能实现了,我也是很无语。。
查询最近7天,设置要查询的天数就行了
$days = Input::get('days', 7); $range = \Carbon\Carbon::now()->subDays($days); $stats = User::where('created_at', '>=', $range) ->groupBy('date') ->orderBy('date', 'DESC') ->remember(1440) ->get([ DB::raw('Date(created_at) as date'), DB::raw('COUNT(*) as value') ]) ->toJSON();
@Wanzj 看我的答案,直接用mysql的date函数,结合Carbon,爽爆了。
@欧阳逸 多谢多谢,有个问题,你查询中的 ->remember(1440) 是一个什么样的用法,我没有用过,是缓存么?
->remember(1440)
@Wanzj 对的,但是有的好像不支持,你把那一行去掉就行了。我现在就是用这个搞的。统计就很简单了
@Wanzj User::whereBetween('created_at', [$start, $end]);用这个统计区间
@欧阳逸
return $this->where('category_id',$category) ->whereBetween('sort_time',[$st,$et]) ->where('device_type',1) ->select(\DB::raw('sum(amount) as y,device as x')) ->groupby('x') ->get();
我现在是所有的数据都是用的区间查的,暂时没有做统计表
@cainiao9980 那麻烦您指出 “弱智” 之处,不足之处我去修改
@Wanzj 该用户已被禁言,大家下次遇到此类回答,不论他多有理,都 @ 我处理。
@Summer 好的老大,:thumbsup: :thumbsup:
进行表分区,如果表数据字段非常多,已经非常大了,可以建个新表,新表分区,就保存需要统计的字段。进行任务定时,往新表,新增数据
@欧阳逸 你能告诉你 Input::get() 这是个什么用法吗
我要举报该,理由是:
给个参考:
@施国鹏 谢谢您的指点,不明白的是您为什么要使用left()函数,不知道是否用 between 会更好一些呢
@Wanzj 参考而已,
@施国鹏 恩,谢谢啦
有更好的方法,我看了作者的视频的,但是忘了怎么写的,我晚点告诉你。
如果数据量大,实时统计是很难的,通常是每天凌晨去跑一下数据存起来,然后查的时候就直接查结果就行了
@欧阳逸 恩恩,好的,谢谢啦
@leo 对于那种不正常的 就像 (2017-10-13 , 2017-11-13)这种时间段的筛选数据,对数据怎么去做统计比较好呢
2017-11-16 14:24:37是 datetime 类型,2017-11-16是 date 类型,这两个类型指的是 MySQL 数据类型。这两个类型中,均可以使用 > 和 < 进行筛选,即:Article::where('created_at', '>', '2017-11-16 14:26:33')->get()甚至直接拿 date 类型的数据去 datetime 字段筛选,都是支持的。@johnlui 恩 了解,现在问题是,数据量大,用这种
where('created_at', '>', '2017-11-16 14:26:33')这种查询的效率就会很低,所以有没有 可以统计这种没有规律的时间段内数据的 方法。@Wanzj 数据量有多大,效率有多低?我帮你对症下药
@johnlui 恩恩,谢谢了, 我有个商品数据表,存的是各大商城每天商品的销量的,现在每天会向数据表插两百条商品的销量,现在差不多有八十万条数据。我需要做的是根据用户选择的时间段,去统计这段时间内的数据,然后合并相同品牌的数据且将销量相加,其实我现在就是用的您说的那种方式,但是我想偷懒一下,做一个统计表,这样就可以将一周的7条数据变成一条数据,一个月的30条数据也变成一条数据,这样会节省不少时间, 但是我遇到了一个问题:当用户选了
2017-01-25-2017-11-14这样一段时间的时候,我该怎么办呢 , @johnlui 非常感谢您上面给的提示,谢谢这种非确定时间的统计只能实时来做,建议从优化数据库性能方向着手。
@johnlui 好的大哥,让我受益匪浅,谢谢啦
@Wanzj 还有一种办法,告诉产品经理这个不好做,让他找妥协的方案
@leo 哈哈,产品找来了 某某数据分析平台,说,人家的这个功能实现了,我也是很无语。。
查询最近7天,设置要查询的天数就行了
@Wanzj 看我的答案,直接用mysql的date函数,结合Carbon,爽爆了。
@欧阳逸 多谢多谢,有个问题,你查询中的
->remember(1440)是一个什么样的用法,我没有用过,是缓存么?@Wanzj 对的,但是有的好像不支持,你把那一行去掉就行了。我现在就是用这个搞的。统计就很简单了
@Wanzj User::whereBetween('created_at', [$start, $end]);用这个统计区间
@欧阳逸
我现在是所有的数据都是用的区间查的,暂时没有做统计表
@cainiao9980 那麻烦您指出 “弱智” 之处,不足之处我去修改
@Wanzj 该用户已被禁言,大家下次遇到此类回答,不论他多有理,都 @ 我处理。
@Summer 好的老大,:thumbsup: :thumbsup:
进行表分区,如果表数据字段非常多,已经非常大了,可以建个新表,新表分区,就保存需要统计的字段。进行任务定时,往新表,新增数据
@欧阳逸 你能告诉你 Input::get() 这是个什么用法吗