MySQL 根据某一个字段怎么进行数据统计? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
bzj
V2EX    PHP

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

  •  
  •   bzj 2018 年 1 月 27 日 5723 次点击
    这是一个创建于 3009 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    大家就别喷了,给楼主一个活路吧
    coderwen
        18
    coderwen  
       2018 年 1 月 27 日 via iPhone
    服气
    abusizhishen
        19
    abusizhishen  
       2018 年 1 月 27 日 via Android
    group by manager_id,status
    ngloom
        20
    ngloom  
       2018 年 1 月 27 日
    <sql 必知必会>很薄的一本书, 看完以后基础的 sql 知识框架就有了
    jason19659
        21
    jason19659  
       2018 年 1 月 27 日
    666666666666
    cncqw
        22
    cncqw  
       2018 年 1 月 28 日
    楼主还是很机智的,首先这代码正常人写不出来,其次还知道上网来问,只要思想不滑坡,办法总比困难多
    mingl0280
        23
    mingl0280  
       2018 年 1 月 28 日
    这特么不是一句 Group By 就解决了的问题么
    你真是写 PHP 的?
    dangyuluo
        24
    dangyuluo  
       2018 年 1 月 28 日
    哎你这。。给 PHP 招黑呢
    chinagxwei
        25
    chinagxwei  
       2018 年 1 月 28 日
    这个是 sql 基础吧……
    zhezimi
        26
    zhezimi  
       2018 年 1 月 28 日
    这样写法很粗暴,但同时易读性非常高
    mingl0280
        27
    mingl0280  
       2018 年 1 月 29 日
    @zhezimi 你在逗我吧……
    strive
        28
    strive  
       2018 年 1 月 29 日
    php 果然是最好的语言
    mingzu
        29
    mingzu  
       2018 年 1 月 29 日
    真的不是来黑我大 PHP 的吗...
    zhezimi
        30
    zhezimi  
       2018 年 1 月 29 日
    @mingl0280 难道你不觉得这种写法,很适合 PHP 小白吗,就那种纯小白
    mingl0280
        31
    mingl0280  
       2018 年 1 月 29 日
    @zhezimi 评价不了……总感觉这种写法挺吓人的……
    aksoft
        32
    aksoft  
       2018 年 1 月 29 日
    人家来问问题,不用嘲笑吧?
    leeg810312
        33
    leeg810312  
       2018 年 1 月 29 日
    SQL 的 group by 还不会,真的是萌新,不过知道很蠢来求教,还是很好学的
    pantingwen
        34
    pantingwen  
       2018 年 1 月 29 日
    看着代码说明楼主 php 水平挺好的,只是数据库不熟而已了,为了 DRY 原则你这三大段考虑疯转到函数里面
    mingl0280
        35
    mingl0280  
       2018 年 1 月 30 日
    @pantingwen PHP 水平好就写不出来这种玩意儿了……
    mingl0280
        36
    mingl0280  
       2018 年 1 月 30 日
    @pantingwen 参考 @akira 的代码吧
    顺便一提可以用 array_sum 取某个 manager_id 下的订单和的。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2810 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 328ms UTC 13:17 PVG 21:17 LAX 06:17 JFK 09:17
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86