[mysql] select语句中比较两个max函数查询出来的时间,然后出现诡异的情况

    xiaoxiao2021-04-13  24

    $user_list=$user->alias(u)->field("u.user_id, u.user_money,(case when u.user_name<>'' then u.user_name else u.nick end) AS hym,u.user_name AS phone,u.rank_points AS rank_points,u.reg_time AS reg_time,u.nick AS nick,sa.shop_name AS shop_name,sum(goods_amount)+sum('total_amount') AS amounts,count(oi.order_id)+count(so.id) AS pay_count,greatest((case when max(oi.add_time)<>'' then max(oi.add_time) else 0 end),(case when max(UNIX_TIMESTAMP(so.create_time))<>'' then max(UNIX_TIMESTAMP(so.create_time)) else 0 end)) AS latest_consumption_time")

                ->join(C("DB_NAME").'.ecs_mem_card mc ON mc.uid=u.user_id','LEFT')             ->join(C("DB_NAME").'.ecs_shop_address sa ON sa.shop_id=mc.shop_id','LEFT')             ->join('ecs_order_info oi ON ((oi.order_status=5 AND oi.shipping_status=2) OR oi.order_status=6) AND oi.user_id=u.user_id','LEFT')             ->join(C("DB_NAME").'.ecs_shop_order so ON so.state=1 AND so.user_name=u.user_name','LEFT')             ->group('u.user_id')

                ->where($where)->limit(($page-1)*C("PAGE_SIZE"),C("PAGE_SIZE"))->select();   

    加红色部分,就是比较max(oi.add_time)和max(unix_timestamp(so.create_time) )  ,这两个值都是时间戳,但是在比较的时候,显示的结果都不对,最后通过排查,原来是因为这两个值有时候会为NULL,在与NULL进行比较的时候显示错误的结果。所以最后加入了case when语句判断,当值为null的时候,转成0,然后再进行比较,这样输出的结果就不会错了

    另一种方法:

    COALESCE(sum(money_paid),0)

    max(),sum()函数找不到记录时,会返回NULL,而不是0,如果我们需要这个返回值直接结算时,NULL+数值 会出现错误,所以要对,如果返回为NULL时,让它等于0

    转载请注明原文地址: https://ju.6miu.com/read-668588.html

    最新回复(0)