MySQL 根据某一个字段怎么进行数据统计?

2018-01-27 18:16:41 +08:00
 bzj

目前有一个订单表,表里有 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;
                }
            }
        }
5067 次点击
所在节点    PHP
36 条回复
jason19659
2018-01-27 20:59:58 +08:00
666666666666
cncqw
2018-01-28 01:10:02 +08:00
楼主还是很机智的,首先这代码正常人写不出来,其次还知道上网来问,只要思想不滑坡,办法总比困难多
mingl0280
2018-01-28 02:42:52 +08:00
这特么不是一句 Group By 就解决了的问题么
你真是写 PHP 的?
dangyuluo
2018-01-28 04:37:16 +08:00
哎你这。。给 PHP 招黑呢
chinagxwei
2018-01-28 12:48:46 +08:00
这个是 sql 基础吧……
zhezimi
2018-01-28 23:15:40 +08:00
这样写法很粗暴,但同时易读性非常高
mingl0280
2018-01-29 04:05:11 +08:00
@zhezimi 你在逗我吧……
strive
2018-01-29 08:45:29 +08:00
php 果然是最好的语言
mingzu
2018-01-29 09:44:00 +08:00
真的不是来黑我大 PHP 的吗...
zhezimi
2018-01-29 10:50:17 +08:00
@mingl0280 难道你不觉得这种写法,很适合 PHP 小白吗,就那种纯小白
mingl0280
2018-01-29 12:07:09 +08:00
@zhezimi 评价不了……总感觉这种写法挺吓人的……
aksoft
2018-01-29 13:31:55 +08:00
人家来问问题,不用嘲笑吧?
leeg810312
2018-01-29 13:43:43 +08:00
SQL 的 group by 还不会,真的是萌新,不过知道很蠢来求教,还是很好学的
pantingwen
2018-01-29 22:10:42 +08:00
看着代码说明楼主 php 水平挺好的,只是数据库不熟而已了,为了 DRY 原则你这三大段考虑疯转到函数里面
mingl0280
2018-01-30 16:19:25 +08:00
@pantingwen PHP 水平好就写不出来这种玩意儿了……
mingl0280
2018-01-30 16:22:50 +08:00
@pantingwen 参考 @akira 的代码吧
顺便一提可以用 array_sum 取某个 manager_id 下的订单和的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/426434

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX