MySql group by分组排序的问题

CREATE TABLE `supplier_price_item` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `bloc_code` varchar(30) NOT NULL DEFAULT '' COMMENT '集团code',
  `supplier_price_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '供应商报价表id',
  `supplier_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '供应商id',
  `product_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '产品id',
  `purchase_price` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '采购价',
  `sell_price` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '销售价',
  `service_charge` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '服务费',
  `status` int(4) NOT NULL DEFAULT '0' COMMENT '1上架 2下架',
  `deleted` int(4) NOT NULL DEFAULT '0' COMMENT '0未删除  1删除',
  `create_user` varchar(30) NOT NULL DEFAULT '' COMMENT '创建人',
  `update_user` varchar(30) NOT NULL DEFAULT '' COMMENT '更新人',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=46 DEFAULT CHARSET=utf8mb4;

例如:我要查询所有的产品id(去重) 且要价格最低 ,

1、错误写法

sql1:这样查出的结果并不是想要的,因为sql先执行group by 后执行order by

select * from supplier_price_item 
group by product_id 
order by sell_price desc 

2、用子查询先排序再group by的误区

sql2:可以用子查询先排序再group by

select * from (
select * from supplier_price_item
order by sell_price desc
) as spi 
group by product_id 

因为mysql 5.6之后版本对排序的sql解析做了优化,子查询中的排序是会被忽略的,所以上面的order by id desc未起到作用。如果子语句中排序不做优化那不就可以了么,查阅资料发现可以在子语句中加上limit来避免这种优化(加上limit相当于临时表限定了取值范围不会进行优化,如果是全表的话就被优化掉了)。

3、可以达到目的,但不推荐

sql3:mysql 5.6之后版本加上 limit

select * from (
select * from supplier_price_item
order by sell_price desc
limit 10000000
) as spi 
group by product_id 

这样可以达到目的但是并不推荐这么写,这种写法不可取,只是权宜之计。

你可能感兴趣的:(mysql)