bzj
V2EX  ›  PHP

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

  •  
  •   bzj · Jan 27, 2018 · 6219 views
    This topic created in 3201 days ago, the information mentioned may be changed or developed.

    目前有一个订单表,表里有 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;
                    }
                }
            }
    
    36 replies  •  2018-01-30 16:22:50 +08:00
    lihongjie0209
    lihongjie0209
    Jan 27, 2018
    1
    这代码 666666666666666666
    lihongjie0209
    lihongjie0209
    Jan 27, 2018
    2
    看需求是需要用 sql 分组, 然后 count. 分组以 status 和 manager_id 字段为分组键(好像是这么叫的).
    zjp
    zjp
    Jan 27, 2018 via Android❤️1
    3
    借用某 V 友的话,PHPer 总能做出不可思议的事情来…
    LeoSocks
    LeoSocks
    Jan 27, 2018 via iPhone
    4
    这代码神奇了。楼下继续吐槽。
    提示:group by manager_id,status
    xuchen
    xuchen
    Jan 27, 2018
    5
    这个锅,拍黄片不背。
    guyskk0x0
    guyskk0x0
    Jan 27, 2018 via Android
    6
    @lihongjie0209 group by
    0ZXYDDu796nVCFxq
    0ZXYDDu796nVCFxq
    Jan 27, 2018 via iPhone
    7
    这代码,膜拜
    ming2050
    ming2050
    Jan 27, 2018 via iPhone
    8
    这都能搞定,php 是世界上最好的语言
    akira
    akira
    Jan 27, 2018
    9
    试试这个是不是你要的

    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
    torbrowserbridge
    Jan 27, 2018 via Android
    10
    这样的代码 java 写不出?太渣了吧哈哈
    WuwuGin
    WuwuGin
    Jan 27, 2018 via Android
    11
    黝黑蜗壳
    monsterxx03
    monsterxx03
    Jan 27, 2018 via iPhone
    12
    以前微博上有人吐槽去面试的没几个写得出 group by, 我还不相信......
    Morriaty
    Morriaty
    Jan 27, 2018
    13
    感觉要成神贴
    lsvih
    lsvih
    Jan 27, 2018
    14
    膜拜大神的代码
    Sanko
    Sanko
    Jan 27, 2018 via Android
    15
    哈哈哈太暴力啦~
    mdzz
    mdzz
    Jan 27, 2018❤️1
    16
    幸好 manager_id 只有 1~3
    skyjerry
    skyjerry
    Jan 27, 2018
    17
    楼主已经提前说了,觉得这个实现很蠢

    大家就别喷了,给楼主一个活路吧
    coderwen
    coderwen
    Jan 27, 2018 via iPhone
    18
    服气👍
    abusizhishen
    abusizhishen
    Jan 27, 2018 via Android
    19
    group by manager_id,status
    ngloom
    ngloom
    Jan 27, 2018
    20
    <sql 必知必会>很薄的一本书, 看完以后基础的 sql 知识框架就有了
    jason19659
    jason19659
    Jan 27, 2018
    21
    666666666666
    cncqw
    cncqw
    Jan 28, 2018
    22
    楼主还是很机智的,首先这代码正常人写不出来,其次还知道上网来问,只要思想不滑坡,办法总比困难多
    mingl0280
    mingl0280
    Jan 28, 2018
    23
    这特么不是一句 Group By 就解决了的问题么
    你真是写 PHP 的?
    dangyuluo
    dangyuluo
    Jan 28, 2018
    24
    哎你这。。给 PHP 招黑呢
    chinagxwei
    chinagxwei
    Jan 28, 2018
    25
    这个是 sql 基础吧……
    zhezimi
    zhezimi
    Jan 28, 2018
    26
    这样写法很粗暴,但同时易读性非常高
    mingl0280
    mingl0280
    Jan 29, 2018
    27
    @zhezimi 你在逗我吧……
    strive
    strive
    Jan 29, 2018
    28
    php 果然是最好的语言
    mingzu
    mingzu
    Jan 29, 2018
    29
    真的不是来黑我大 PHP 的吗...
    zhezimi
    zhezimi
    Jan 29, 2018
    30
    @mingl0280 难道你不觉得这种写法,很适合 PHP 小白吗,就那种纯小白
    mingl0280
    mingl0280
    Jan 29, 2018
    31
    @zhezimi 评价不了……总感觉这种写法挺吓人的……
    aksoft
    aksoft
    Jan 29, 2018
    32
    人家来问问题,不用嘲笑吧?
    leeg810312
    leeg810312
    Jan 29, 2018
    33
    SQL 的 group by 还不会,真的是萌新,不过知道很蠢来求教,还是很好学的
    pantingwen
    pantingwen
    Jan 29, 2018
    34
    看着代码说明楼主 php 水平挺好的,只是数据库不熟而已了,为了 DRY 原则你这三大段考虑疯转到函数里面
    mingl0280
    mingl0280
    Jan 30, 2018
    35
    @pantingwen PHP 水平好就写不出来这种玩意儿了……
    mingl0280
    mingl0280
    Jan 30, 2018
    36
    @pantingwen 参考 @akira 的代码吧
    顺便一提可以用 array_sum 取某个 manager_id 下的订单和的。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   5124 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 119ms · UTC 07:41 · PVG 15:41 · LAX 23:41 · JFK 02:41
    ♥ Do have faith in what you're doing.