Mysql 的bug?子查询包含group by结果各异

三张表,字段和数据如下,简单起见都是整形:

zzz_repair:==》维修订单表, 列依次为:订单号, 省份

zzz_repair_goods:==》维修商品表, 列依次为 订单号、商品名称、商品数量

zzz_sell: ==》销售表,列依次为销售省份、销售商品、销售数量

sql: =>求平均每个省的返修比率

select

--省份分组

m.province,

--返修数 / 总销售数

sum(num)/(select sum(num) from zzz_sell z where z.province=m.province) as rate

from

--连表

(select a.*, b.num from zzz_repair a, zzz_repair_goods b where a.sn=b.sn) m

--分组求和

group by m.province

最后的结果如下,可见对于省份2,计算结果0.5是正确的才对,为何MySQL 5.5 显示为null

MySQL 5.5

MySQL 5.6

附上所有脚本:

drop table IF EXISTS zzz_repair;
drop table IF EXISTS zzz_repair_goods;
drop table IF EXISTS zzz_sell;

CREATE TABLE IF NOT EXISTS `zzz_repair` (
`sn` int(11) NOT NULL,
`province` int(11) NOT NULL
) ;
INSERT INTO `zzz_repair` (`sn`, `province`) VALUES
(1, 2),
(3, 3),
(5, 5),
(8, 8);

CREATE TABLE IF NOT EXISTS `zzz_repair_goods` (
`sn` int(11) NOT NULL,
`name` int(11) NOT NULL,
`num` int(11) NOT NULL
) ;

INSERT INTO `zzz_repair_goods` (`sn`, `name`, `num`) VALUES
(1, 2, 10),
(3, 4, 10),
(5, 6, 10);

CREATE TABLE IF NOT EXISTS `zzz_sell` (
`sn` int(11) NOT NULL,
`province` int(11) NOT NULL,
`num` int(11) NOT NULL
) ;
INSERT INTO `zzz_sell` (`sn`, `province`, `num`) VALUES
(1, 2, 20),
(3, 4, 20),
(5, 6, 20),
(9, 9, 20);

时间: 2024-10-03 06:24:36

Mysql 的bug?子查询包含group by结果各异的相关文章

MySQL学习笔记-子查询和连接

MySQL学习笔记-子查询和连接 使客户端进入gbk编码方式显示: mysql> SET NAMES gbk; 1.子查询 子查询的定义: 子查询(Subquery)是指出现在其他SQL语句内的SELECT子句. 例如:  SELECT * FROM t1 WHERE col1 = (SELECT col2 FROM t2); 其中SELECT * FROM t1 称为Outer Query / Outer Statement (外部查询) SELECT col2 FROM t2 , 被称为Su

MySQL里面的子查询

一.子查询定义 定义: 子查询允许把一个查询嵌套在另一个查询当中. 子查询,又叫内部查询,相对于内部查询,包含内部查询的就称为外部查询. 子查询可以包含普通select可以包括的任何子句,比如:distinct. group by.order by.limit.join和union等:但是对应的外部查询必须是以下语句之一:select.insert.update.delete.set或 者do. 子查询的位置: select 中.from 后.where 中.group by 和order by

MySQL中IN子查询会导致无法使用索引

原文:MySQL中IN子查询会导致无法使用索引 今天看到一个博客园的一篇关于MySQL的IN子查询优化的案例,一开始感觉有点半信半疑(如果是换做在SQL Server中,这种情况是绝对不可能的,后面会做一个简单的测试.)随后动手按照他说的做了一个表来测试验证,发现MySQL的IN子查询做的不好,确实会导致无法使用索引的情况(IN子查询无法使用所以,场景是MySQL,截止的版本是5.7.18) MySQL的测试环境 测试表如下 create table test_table2 ( id int a

mysql update from 子查询

mssql 子查询更新 update log set uin= b.uinfrom log a,logs bwhere a.accountuin = b.accountuin mysql 不支持 update 子查询更新 找了半天资料 终于搞定了... update `log` a inner join `logs` b on a.`accountuin` = b.`accountuin`set a.`uin` = b.`uin` where a.`accountuin` = b.`accoun

详细讲述MySQL中的子查询操作 (来自脚本之家)

继续做以下的前期准备工作: 新建一个测试数据库TestDB: ? 1 create database TestDB; 创建测试表table1和table2: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 CREATE TABLE table1 (   customer_id VARCHAR(10) NOT NULL,   city VARCHAR(10) NOT NULL,   PRIMARY KEY(customer_id) )ENGINE=INNODB DEFAULT CH

mysql 子句、子查询、连接查询

一.mysql查询的五种子句 where子句(条件查询):按照“条件表达式”指定的条件进行查询. group by子句(分组):按照“属性名”指定的字段进行分组.group by子句通常和count().sum()等聚合函数一起使用. having子句(筛选):有group by才能having子句,只有满足“条件表达式”中指定的条件的才能够输出. order by子句(排序):按照“属性名”指定的字段进行排序.排序方式由“asc”和“desc”两个参数指出,默认是按照“asc”来排序,即升序.

MYSQL基础九--子查询和连接

1.子查询是出现在其他SQL语句内的SELECT子句. 子查询指嵌套在查询内部,且必须始终出现在圆括号内. 子查询可以包含多个关键字或条件,如DISTINCT,GROUP BY,ORDER BY,LIMIT,函数等. 子查询的外层查询可以是:SELECT,UPDATE,INSERT,SET或DO. 2.子查询的返回结果 子查询可以返回标量,一行,一列或子查询. 3.使用比较运算符的子查询 SELECT goods_id,goods_name,goods_price FROM tab_red WH

MySql学习(三) —— 子查询(where、from、exists) 及 连接查询(left join、right join、inner join、union join)

同样的,使用goods表来练习子查询,表结构如下: 所有数据(cat_id与category.cat_id关联): 类别表: mingoods(连接查询时作测试) 一.子查询 1.where型子查询:把内层查询的结果作为外层查询的比较条件 1.1 查询id最大的一件商品(使用排序+分页实现) :mysql> SELECT goods_id,goods_name,shop_price FROM goods ORDER BY goods_id DESC LIMIT 1; 1.2 查询id最大的一件商

MySQL where型子查询

where型子查询是内层查询的结果,作为外层sql的比较条件. select goods_id, goods_name from goods where goods_id = (select max(goods_id) from         goods); 内层查询为select max(goods_id) from goods 外层查询为select goods_id, goods_name from goods where goods_id 就是在把最大的goods_id的值赋给外层的g