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;
                }
            }
        }
4860 次点击
所在节点    PHP
36 条回复
lihongjie0209
2018-01-27 18:39:33 +08:00
这代码 666666666666666666
lihongjie0209
2018-01-27 18:41:28 +08:00
看需求是需要用 sql 分组, 然后 count. 分组以 status 和 manager_id 字段为分组键(好像是这么叫的).
zjp
2018-01-27 18:48:06 +08:00
借用某 V 友的话,PHPer 总能做出不可思议的事情来…
LeoSocks
2018-01-27 18:51:03 +08:00
这代码神奇了。楼下继续吐槽。
提示:group by manager_id,status
xuchen
2018-01-27 18:51:38 +08:00
这个锅,拍黄片不背。
guyskk0x0
2018-01-27 18:51:39 +08:00
@lihongjie0209 group by
gstqc
2018-01-27 18:52:05 +08:00
这代码,膜拜
mringg
2018-01-27 18:52:29 +08:00
这都能搞定,php 是世界上最好的语言
akira
2018-01-27 18:53:35 +08:00
试试这个是不是你要的

select manager_id , status, count(1) from xxxx
group by manager_id , status

另外, 你的循环可以改成
foreach ($lists as $list) {
$counts[$list['manager_id']][$list['status'] ] +=1;
torbrowserbridge
2018-01-27 18:54:52 +08:00
这样的代码 java 写不出?太渣了吧哈哈
WuwuGin
2018-01-27 18:55:44 +08:00
黝黑蜗壳
monsterxx03
2018-01-27 18:56:43 +08:00
以前微博上有人吐槽去面试的没几个写得出 group by, 我还不相信......
Morriaty
2018-01-27 19:15:55 +08:00
感觉要成神贴
lsvih
2018-01-27 19:47:46 +08:00
膜拜大神的代码
Sanko
2018-01-27 19:53:48 +08:00
哈哈哈太暴力啦~
mdzz
2018-01-27 19:54:16 +08:00
幸好 manager_id 只有 1~3
skyjerry
2018-01-27 20:00:20 +08:00
楼主已经提前说了,觉得这个实现很蠢

大家就别喷了,给楼主一个活路吧
coderwen
2018-01-27 20:07:06 +08:00
服气👍
abusizhishen
2018-01-27 20:20:27 +08:00
group by manager_id,status
ngloom
2018-01-27 20:30:07 +08:00
<sql 必知必会>很薄的一本书, 看完以后基础的 sql 知识框架就有了

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

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

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

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

© 2021 V2EX