V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
bzj
V2EX  ›  PHP

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

  •  
  •   bzj · 2018-01-27 18:16:41 +08:00 · 5039 次点击
    这是一个创建于 2492 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目前有一个订单表,表里有 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 条回复    2018-01-30 16:22:50 +08:00
    lihongjie0209
        1
    lihongjie0209  
       2018-01-27 18:39:33 +08:00
    这代码 666666666666666666
    lihongjie0209
        2
    lihongjie0209  
       2018-01-27 18:41:28 +08:00
    看需求是需要用 sql 分组, 然后 count. 分组以 status 和 manager_id 字段为分组键(好像是这么叫的).
    zjp
        3
    zjp  
       2018-01-27 18:48:06 +08:00 via Android   ❤️ 1
    借用某 V 友的话,PHPer 总能做出不可思议的事情来…
    LeoSocks
        4
    LeoSocks  
       2018-01-27 18:51:03 +08:00 via iPhone
    这代码神奇了。楼下继续吐槽。
    提示:group by manager_id,status
    xuchen
        5
    xuchen  
       2018-01-27 18:51:38 +08:00
    这个锅,拍黄片不背。
    guyskk0x0
        6
    guyskk0x0  
       2018-01-27 18:51:39 +08:00 via Android
    @lihongjie0209 group by
    0ZXYDDu796nVCFxq
        7
    0ZXYDDu796nVCFxq  
       2018-01-27 18:52:05 +08:00 via iPhone
    这代码,膜拜
    mringg
        8
    mringg  
       2018-01-27 18:52:29 +08:00 via iPhone
    这都能搞定,php 是世界上最好的语言
    akira
        9
    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
        10
    torbrowserbridge  
       2018-01-27 18:54:52 +08:00 via Android
    这样的代码 java 写不出?太渣了吧哈哈
    WuwuGin
        11
    WuwuGin  
       2018-01-27 18:55:44 +08:00 via Android
    黝黑蜗壳
    monsterxx03
        12
    monsterxx03  
       2018-01-27 18:56:43 +08:00 via iPhone
    以前微博上有人吐槽去面试的没几个写得出 group by, 我还不相信......
    Morriaty
        13
    Morriaty  
       2018-01-27 19:15:55 +08:00
    感觉要成神贴
    lsvih
        14
    lsvih  
       2018-01-27 19:47:46 +08:00
    膜拜大神的代码
    Sanko
        15
    Sanko  
       2018-01-27 19:53:48 +08:00 via Android
    哈哈哈太暴力啦~
    mdzz
        16
    mdzz  
       2018-01-27 19:54:16 +08:00   ❤️ 1
    幸好 manager_id 只有 1~3
    skyjerry
        17
    skyjerry  
       2018-01-27 20:00:20 +08:00
    楼主已经提前说了,觉得这个实现很蠢

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