
目前有一个订单表,表里有 status 和 manager_id 字段,manager_id 值为 1-3,status 的值为 1-10,表示对应不同的状态,目前我需要把每一个 manager_id 的不同状态的条数查出来,然后展示到一个页面上,本来想利用 sql 自带的 select count 来统计,但是 10 个不同的状态要查 10*3=30 次,对数据库开销太大,所以我把全部数据取出来后利用循环计算,但是总觉得这办法很蠢,请教各位 dalao 有没有更好的办法实现?
这是我之前写的代码,思路是把数据全取出来,然后循环判断累加,所有结果放到一个数组,条数不多,小于 1 万条。
$order = new OrderModel(); $lists = $order->getAllOrder(); for ($i = 1; $i <= 3; $i++) { for ($j = 0; $j <= 6; $j++) { $counts[$i][$j] = 0; } } foreach ($lists as $list) { if ($list['manager_id'] == 1) { $counts[1][0] +=1; if ($list['status'] == 1) { $counts[1][1] += 1; } if ($list['status'] == 2) { $counts[1][2] += 1; } if ($list['status'] == 3) { $counts[1][3] += 1; } if ($list['status'] == 4) { $counts[1][4] += 1; } if ($list['status'] == 5) { $counts[1][5] += 1; } if ($list['status'] == 6) { $counts[1][6] += 1; } } if ($list['manager_id'] == 2) { $counts[2][0] +=1; if ($list['status'] == 1) { $counts[2][1] += 1; } if ($list['status'] == 2) { $counts[2][2] += 1; } if ($list['status'] == 3) { $counts[2][3] += 1; } if ($list['status'] == 4) { $counts[2][4] += 1; } if ($list['status'] == 5) { $counts[2][5] += 1; } if ($list['status'] == 6) { $counts[2][6] += 1; } } if ($list['manager_id'] == 3) { $counts[3][0] +=1; if ($list['status'] == 1) { $counts[3][1] += 1; } if ($list['status'] == 2) { $counts[3][2] += 1; } if ($list['status'] == 3) { $counts[3][3] += 1; } if ($list['status'] == 4) { $counts[3][4] += 1; } if ($list['status'] == 5) { $counts[3][5] += 1; } if ($list['status'] == 6) { $counts[3][6] += 1; } } } 1 lihongjie0209 2018 年 1 月 27 日 这代码 666666666666666666 |
2 lihongjie0209 2018 年 1 月 27 日 看需求是需要用 sql 分组, 然后 count. 分组以 status 和 manager_id 字段为分组键(好像是这么叫的). |
3 zjp 2018 年 1 月 27 日 via Android 借用某 V 友的话,PHPer 总能做出不可思议的事情来… |
4 LeoSocks 2018 年 1 月 27 日 via iPhone 这代码神奇了。楼下继续吐槽。 提示:group by manager_id,status |
5 xuchen 2018 年 1 月 27 日 这个锅,拍黄片不背。 |
6 guyskk0x0 2018 年 1 月 27 日 via Android @lihongjie0209 group by |
7 0ZXYDDu796nVCFxq 2018 年 1 月 27 日 via iPhone 这代码,膜拜 |
8 ming2050 2018 年 1 月 27 日 via iPhone 这都能搞定,php 是世界上最好的语言 |
9 akira 2018 年 1 月 27 日 试试这个是不是你要的 select manager_id , status, count(1) from xxxx group by manager_id , status 另外, 你的循环可以改成 foreach ($lists as $list) { $counts[$list['manager_id']][$list['status'] ] +=1; |
10 torbrowserbridge 2018 年 1 月 27 日 via Android 这样的代码 java 写不出?太渣了吧哈哈 |
11 WuwuGin 2018 年 1 月 27 日 via Android 黝黑蜗壳 |
12 monsterxx03 2018 年 1 月 27 日 via iPhone 以前微博上有人吐槽去面试的没几个写得出 group by, 我还不相信...... |
13 Morriaty 2018 年 1 月 27 日 感觉要成神贴 |
14 lsvih 2018 年 1 月 27 日 膜拜大神的代码 |
15 Sanko 2018 年 1 月 27 日 via Android 哈哈哈太暴力啦~ |
16 mdzz 2018 年 1 月 27 日 幸好 manager_id 只有 1~3 |
17 skyjerry 2018 年 1 月 27 日 楼主已经提前说了,觉得这个实现很蠢 大家就别喷了,给楼主一个活路吧 |
18 coderwen 2018 年 1 月 27 日 via iPhone 服气 |
19 abusizhishen 2018 年 1 月 27 日 via Android group by manager_id,status |
20 ngloom 2018 年 1 月 27 日 <sql 必知必会>很薄的一本书, 看完以后基础的 sql 知识框架就有了 |
21 jason19659 2018 年 1 月 27 日 666666666666 |
22 cncqw 2018 年 1 月 28 日 楼主还是很机智的,首先这代码正常人写不出来,其次还知道上网来问,只要思想不滑坡,办法总比困难多 |
23 mingl0280 2018 年 1 月 28 日 这特么不是一句 Group By 就解决了的问题么 你真是写 PHP 的? |
24 dangyuluo 2018 年 1 月 28 日 哎你这。。给 PHP 招黑呢 |
25 chinagxwei 2018 年 1 月 28 日 这个是 sql 基础吧…… |
26 zhezimi 2018 年 1 月 28 日 这样写法很粗暴,但同时易读性非常高 |
28 strive 2018 年 1 月 29 日 php 果然是最好的语言 |
29 mingzu 2018 年 1 月 29 日 真的不是来黑我大 PHP 的吗... |
32 aksoft 2018 年 1 月 29 日 人家来问问题,不用嘲笑吧? |
33 leeg810312 2018 年 1 月 29 日 SQL 的 group by 还不会,真的是萌新,不过知道很蠢来求教,还是很好学的 |
34 pantingwen 2018 年 1 月 29 日 看着代码说明楼主 php 水平挺好的,只是数据库不熟而已了,为了 DRY 原则你这三大段考虑疯转到函数里面 |
35 mingl0280 2018 年 1 月 30 日 @pantingwen PHP 水平好就写不出来这种玩意儿了…… |
36 mingl0280 2018 年 1 月 30 日 |