美文网首页ThinkPHP
关于 thinkphp怎么使用mysql里的case when

关于 thinkphp怎么使用mysql里的case when

作者: geeooooz | 来源:发表于2019-05-05 17:21 被阅读23次

    实例1:
    引用自:http://www.thinkphp.cn/topic/33363.html

    SELECT rate,times,CASE 
    WHEN times>0 && times<50 THEN 1
    WHEN times>=50 && times<100 THEN 2
    WHEN times>=100 && times<500 THEN 3
    WHEN times>=500 && times<1000 THEN 4
    ELSE 5 END AS flag
    FROM game
    ORDER BY flag,rate DESC
    

    实例2:
    引用自:https://blog.csdn.net/pp_fzp/article/details/77370833

    sql语句使用case when实现列排序
    select * from GIS_FEATURECORRECTION
     order by case correctstatus
                when '待审核' then 1
                when '待处理' then 2
                when '已完成' then 3
                else 4
              end,
              gis_featurecorrection_pkid desc;
    

    实例3:
    比较多
    转载:https://blog.csdn.net/qq_33355821/article/details/86627957
    case when多条件排序等强大用法

    一.多条件排序
    项目中有这么一个需求,标签列表展示,按照已领用的普通卡排第一位,已领用的临时卡排第二位,未领用的普通卡排第三位,未领用的临时卡排第四位,禁用的普通卡排第五位,禁用的临时卡排第六位,普通卡临时卡字段是type(0:普通开,1:临时卡),领用字段是card_status(标签状态(0:启用(已领用),1:未领用,2:禁用),下面是sql

            select * from newcloud_access_card order by 
            case  
            when card_status='0' and type ='1' then 0 
            when card_status='0' and type ='0' then 1
            when card_status='1' and type ='1' then 2
            when card_status='1' and type ='0' then 3
            when card_status='2' and type ='1' then 4
            when card_status='2' and type ='0' then 5
            end;
    

    按照上面这种写法无论多么复杂的排序都可以实现

    二.统计多条件的数据
    项目中有这么一个需求,统计某个个公司的待维保,已维保,维保总数的数量,通过sum()函数与case when来实现,下面是sql

    SELECT SUM(CASE WHEN status = '0' OR status = '2' THEN 1 ELSE 0 END) AS '待维保',
            SUM(CASE WHEN create_date BETWEEN  '2018-09-5 0:41:18' and '2019-07-23 23:41:18' THEN 1 ELSE 0 END) AS '维保总数',
            SUM(CASE WHEN status = '1' and update_date BETWEEN  '2018-09-5 0:41:18' and '2019-07-23 23:41:18' THEN 1 ELSE 0 END) AS '已维保'
        FROM newcloud_fire_process where type='4' and unit_id='DccBRhlrSiu9gMV7fmvizw'
    

    三.表关联统计数据
    现在我需要统计所有在系统中存在的公司的未删除的信标数量,公司没有信标的话数量为0,newcloud_company_basic_info(企业表),newcloud_beacon_point(信标表),newcloud_location_sys(系统表)

    image.png

    如上图所示使用case when进行统计是正确的,系统中存在7家企业,之前我将del_flag筛选条件写在下面,那么就排除掉了没有信标的企业,因为有一家企业没有信标,那么它关联到的信标表就是null,t.del_flag就不存在了,所以没有信标的那家企业就被筛选掉了,这就不是我所需要的结果。如下图:


    image.png

    还有种写法,我们把 关联到的信标表为null的情况也考虑进去,这时候数据也是对的,并且没有信标的那家企业为null的那条数据也显示出来了如下图:


    image.png
    但是这样写也有局限性,当信标表的所有数据把del_flag都变成1,那么6家企业t.del_flag=0这个条件就不满足了,只有一家没有信标的企业满足t.del_flag is null这个条件,所以只会有一条数据
    image.png

    综上所述还是使用case when比较好,当然也是根据需求来确定,我这里是需要不管有没有信标都要将企业的显示出来,有时候的需求可能需要没有的就不显示

    四.重命名 重点

    select ui.user_id,ui.user_name,
    case ui.user_type
        when 'company_legal_person' then '企业法人'
        when 'gov_leader' then '政府领导'
        when 'gov_grid_worker' then '网格员'
        when 'gov' then '政府用户'
        when 'company' then '企业用户'
        when 'company_safer' then '企业安全员'
        when 'company_safe_manager' then '企业安全管理员'
        when 'company_charger' then '企业安全负责人'
        when 'gov_fulltime_worker' then '专职人员'
        else '其他' end as user_type,
    ui.mobile from user_info ui
        left join login_user_relation lur on lur.user_id = ui.user_id 
        left join login_info li on li.login_id=lur.login_id
        where lur.status = '1' and ui.status = '1' and li.status='1'
        and ui.company_id = 'iksbe634ajogetpn'
    
    image.png

    我自己写的实例:
    thinkphp中 field是可以这么写的 field('id','name','case ...')
    废话够多了 下面是代码:

    $member = M('Member')
                ->alias('a')
                ->field(array('a.id','a.name','d.url','CASE 
                        WHEN b.enterprise_id = '.$member_id.' THEN 1
                        WHEN b.enterprise_id1 = '.$member_id.' THEN 2
                        WHEN b.enterprise_id2 = '.$member_id.' THEN 3
                        ELSE 5 END AS flag'))
                        ->join('left join __PERSON_INFO__ b on a.id=b.member_id')
                        ->join('left join __WUSER__ c on c.id = a.wxuser_id')
                        ->join('left join __IMG__ d on d.id = c.headimgurl')
                        ->where($data)
                ->order('flag,a.id DESC')->limit($firstRow,$count)->select();
    

    相关文章

      网友评论

        本文标题:关于 thinkphp怎么使用mysql里的case when

        本文链接:https://www.haomeiwen.com/subject/comhoqtx.html