V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
bzj
V2EX  ›  PHP

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

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

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

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