CREATE TABLE `product_image` (
`id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键id',
`product_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '产品id',
`sort_id` int NOT NULL COMMENT '图片序号',
`img_url` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '图片路径',
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='产品图片表';
这一种也是网上推荐最多的,但个人觉得局限性太大,不介意用在实战上
select * from (select * from product_image order by sort_id limit 10000) a group by a.product_id
问题重点:
相信个别同学复制过去执行就报了this is incompatible with sql_mode=only_full_group_by错误
之所有不推荐在实战中这样写,是因为其中子查询limit 10000已经固定写死了
原因分析:
一、这个错误发生在mysql 5.7.5 版本及以上版本会出现的问题: mysql 5.7.5版本以上默认的sql配置是:sql_mode=“ONLY_FULL_GROUP_BY”,这个配置严格执行了"SQL92标准"。 很多从5.6升级到5.7时,为了语法兼容,大部分都会选择调整sql_mode,使其保持跟5.6一致,为了尽量兼容程序。
二、在sql执行时,出现该原因,简单来说就是: 由于开启了ONLY_FULL_GROUP_BY的设置,如果select 的字段不在 group by 中, 并且select 的字段未使用聚合函数(SUM,AVG,MAX,MIN等)的话,那么这条sql查询是被mysql认为非法的,会报错误…
所以mysql在5.7.5版本及以上版本就会报这个错误
select ANY_VALUE(id),
product_id,
ANY_VALUE(sort_id) from (select * from product_image order by sort_id limit 100000) a group by a.product_id