[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
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
相关文章推荐
- Mysql update语句赋值嵌套select,更新和查询同一张表,必须取别名;用例:更新指定游戏服务器最后启动记录的结束时间
- MySQL使用select语句查询指定表中指定时间内指定列(字段)所在行的数据
- 比较不同查询语句使用索引的情况
- SQL查询语句:关于时间的比较
- 单个select语句实现MySQL查询统计次数
- mysql sql语句执行时间查询
- 诡异的oracle8i,Select语句查询字段个数居然有限制
- LAMP开发精要(13):PHP中使用mysql_stmt(预处理语句)处理select查询结果
- MySQL解析器源码分析--对select语句中子查询处理逻辑的分析(一)
- Mysql中分页查询两个方法比较
- 设计select语句时影响效率查询的15个情况
- oracle中用一条select 语句把符合多个条件的查询结果列出来
- mysql c#中出现的时间没办法转换的情况
- mysql中提高Order by语句查询效率的两个思路分析
- 6,mysql查询语句,select查询
- php中使用mysql_stmt(预处理语句)来处理select查询结果
- SELECT语句查询到一半,出现‘中断’
- MySQL IFNULL中可以有select语句;查询一个表中的数据,同时查看另一个表中是否有符合条件的额数据
- Sql server中时间查询的一个比较快的语句
- mysql 查询指定日期时间内sql语句实现原理与代码