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

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

  •  
  •   bzj · 116 天前 · 1916 次点击
    这是一个创建于 116 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    另外, 你的循环可以改成
    foreach ($lists as $list) {
    $counts[$list['manager_id']][$list['status'] ] +=1;
        10
    torbrowserbridge   116 天前 via Android
    这样的代码 java 写不出?太渣了吧哈哈
        11
    WuwuGin   116 天前 via Android
    黝黑蜗壳
        12
    monsterxx03   116 天前 via iPhone
    以前微博上有人吐槽去面试的没几个写得出 group by, 我还不相信......
        13
    Morriaty   116 天前
    感觉要成神贴
        14
    lsvih   116 天前
    膜拜大神的代码
        15
    Sanko   116 天前 via Android
    哈哈哈太暴力啦~
        16
    mdzz   116 天前   ♥ 1
    幸好 manager_id 只有 1~3
        17
    skyjerry   116 天前
    楼主已经提前说了,觉得这个实现很蠢

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