Mysql float/double 类型数据查询小数位数不对(精度失常)

原先项目有关金额的部分数据都会定义成 float 或 double 类型,可以肯定的是 32 位存储空间 float 和 64 位存储空间的 double 具有更高的精度。但在实际对数据进行加工,比如 sum 求和等得到的数据会出现更多位的小数。比如手动计算结果 7.75 使用了 sum 函数得到 7.750000059604645。从数字层面上可以很清晰的觉察到数据的精度发生了变化,但这却并不怪

mysql 创建存储过程 (procedure)

网上找到一篇 使用Navicat for MySQL创建存储过程 的文章,通过查询窗口执行创建 procedure 的语句。CREATE PROCEDURE `insert_boxes`(IN total int) BEGIN declare i int default 1000; while i < total+1500 do insert into boxes (id) values (

MySQL 子查询多个字段关联到结果集

正常情况下可以在 select 内嵌套子查询作为结果集的字段,示例如下:select id,name,(SELECT COUNT(id) FROM records WHERE user_id = users.id ) AS box_count FROM users where user_id = 9527;但如果需要子查询的多个字段返回,此时放在 select 是不行的:SELECT SUM(m

MySQL 查询结果由列转成行数据

行内字段拼接组合可以用到 CONCAT(),如果需要指定分隔符可以使用 CONCAT_WS(',', xx, xx..),但如何将多行数据提取到单行结果中呢?明确需求是,递归查询所属下级的id,最终用表中的 id 拼接成字串。这当然可以放在 php 代码里使用 implode 函数去实现,但这次需要通过 sql 做一个临时的查询。因为所属下级最大层级为 3 级,所以可以通过 sql 的 union

mysql 解决多表关联数据记录重复问题

问题说明遇到的情况类似于包含某商品的店铺订单总金额,订单明细表 -> 订单表关系为 n:1。如果明确商品 ID,可以将明细表与订单表关系约束为 1:1,这样计算的订单总金额就不会存在重复统计。但当前需要统计多个商品,这样如果直接通过多表联查并聚合统计店铺订单总金额就会存在重复统计的问题。当然可以直接绕过商品明细表,直接计算商铺订单总金额,但这样无法对商品进行约束。解决网络上有针对单表查询重复

mysql SUM 函数使用问题和精度计算

先看一下函数语法:SUM(DISTINCT expression)如果在没有返回匹配行 SELECT 语句中使用 SUM 函数,则 SUM 函数返回 NULL,而不是0。DISTINCT 运算符允许计算集合中的不同值。SUM 函数忽略计算中的 NULL 值。在没有匹配行 SUM 会返回 NULL 而不是 0,这是我之前没有注意到的点。为了让结果不会 NULL 而是 0,可以使用 COALESCE(

mysql 求日期差值,计算上线天数或注册天数

本来计算上线天数或注册天数是可以放到查询返回结果中处理的,但业务逻辑需要筛选上线天数达到7天、30天的记录,也就是说日期差值需要用在 where 子句中。这时需要 mysql 的库函数来帮忙处理了。涉及到处理时间差值的 mysql 库函数有这几个:TIMEDIFF()、DATEDIFF()、TIMESTAMPDIFF()。1. 使用 TIMEDIFF() 函数,求 time 差值timediff(

sql 报错:Table is specified twice, both as a target for 'UPDATE' and as a separate source for data

如题,sql 报错:Table is specified twice, both as a target for 'UPDATE' and as a separate source for data。表被指定了两次,同时作为 update 对象和独立数据源。报错场景:查询两个表的差集并更新记录。举例说明:a、b 两表联查,找出 a 表中存在 b 表不存在的记录,然后更新 a 表的某个字段做标记。报