您的位置:首页 > 数据库 > MySQL

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

2017-04-13 17:45 375 查看
$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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: