mysql - 关于 PHP 中订单按照从大到小的顺序排序的思路.
每一个用户会产生 N 多订单 现在要排序 订单数量从大到小 的用户.
如果按照传统 我先将每一个用户的订单总数统计,然后进行排序.这样一但数据量变大基本无法排序会很消耗系统资源统计时间也会变长.请问有什么方法吗?
回复内容:
现在我的需求是这样的,
每一个用户会产生 N 多订单 现在要排序 订单数量从大到小 的用户.
如果按照传统 我先将每一个用户的订单总数统计,然后进行排序.这样一但数据量变大基本无法排序会很消耗系统资源统计时间也会变长.请问有什么方法吗?
0.假设一天几十万的订单,搞个脚本,每天跑一次,统计一天的订单数
1.根据订单时间从数据库获取每天的总订单
可以为时间加上索引
2.根据取出的数据,从程序方面,按用户分组,统计订单中每位用户的订单数
不要用sql来做分组统计,因为数据库压力会非常大,可以放到php中来做处理,统计这些订单中的每一个用户有多少订单,相当于sql中的group by user
3.然后加到用户的订单总数中,可以放到redis中
像这种情况,可可以新增统计表呀。各种统计数据可以每天定时统计呀。然后就不用每次都要去统计一遍喽。
用户表增加一个订单总数和订单总金额的字段不就行了...
这是典型的空间时间转换嘛。。。既然你性能跟不上只能加字段或者看需求了,或者换一种数据库会稍微好一点
如果你有这样的业务需求的话,我建议在用户的这个表中增加一个列,就是计算用户购买的订单的数量列。这样用户每创建一个订单则就+1,最后排序的时候,可以直接按照这个字段排序就ok了。简单快捷。
用户表 user
id | name
1 | 张三
2 | 李四
3 | 王五
4 | 赵六
订单表 order
user_id | orderNo
1 | 1111111
2 | 2222222
1 | 3333333
3 | 4444444
3 | 5555555
2 | 6666666
3 | 7777777
3 | 8888888
2 | 9999999
查询语句
select a.id,a.name,ifnull(b.num,0) as order_num from user as a left join
(select user_id,count(orderNo) as num from order where 1 group by orderNo) as b on a.id=b.user_id order by b.num desc
查询结果
id | name | order_num
3 王五 4
2 李四 3
1 张三 2
4 赵六 0
那你可以直接在一个sql里面查询就好了:
select count(*) as num from `order` group by id