mysql中sql_mode=only_full_group_by下的group by

背景:这是一个菜单表,类型有目录、菜单、按钮。
需求:根据类型分组查看组内最大的id和菜单标题。

mysql中sql_mode=only_full_group_by下的group by_第1张图片
数据示例.png

问题:sql_mode=only_full_group_by按平常的写法报错(如图)。


报错图.png

解决方案:
1.any_value包裹住没有参与分组的字段。

SELECT max(id), type,any_value(title) FROM admin_menu GROUP BY type

mysql中sql_mode=only_full_group_by下的group by_第2张图片
查询结果1.png

2.关联,先查询出来重复类型中的最大id,再与自身关联查询出所要字段。

SELECT
 s2.id,s2.type,s2.title  from( SELECT type,max(id) as id FROM admin_menu GROUP BY type ) s1
 JOIN admin_menu s2 ON s2.id = s1.id;

mysql中sql_mode=only_full_group_by下的group by_第3张图片
查询结果2.png

3.WITH AS,先分组查询出来的结果作为临时表再关联原表查询出来响应信息。

WITH g_tt AS ( SELECT max(id), type FROM admin_menu GROUP BY type ) SELECT
s.id,s.type,s.title
FROM
 g_tt g
 JOIN admin_menu s ON s.id = g.id;

注:WITH AS的用法MySQL5.8才开始支持,仅做示例。

总结:
1.any_value包裹住没有参与分组的字段。
2.关联,先查询出来重复类型中的最大id,再与自身关联查询出所要字段。
3.WITH AS,先分组查询出来的结果作为临时表再关联原表查询出来响应信息。

建表语句:

##建表语句
CREATE TABLE `admin_menu` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `pid` bigint(20) DEFAULT NULL COMMENT '父菜单id',
  `type` varchar(1) DEFAULT NULL COMMENT '1目录 2菜单 3按钮',
  `title` varchar(255) DEFAULT NULL COMMENT '菜单标题',
  `name` varchar(255) DEFAULT NULL COMMENT '组件名称',
  `component` varchar(255) DEFAULT NULL COMMENT '组件',
  `sort` int(5) DEFAULT NULL COMMENT '排序',
  `path` varchar(255) DEFAULT NULL COMMENT '链接地址',
  `permission` varchar(255) DEFAULT NULL COMMENT '权限',
  `is_del` varchar(1) DEFAULT NULL COMMENT '删除状态',
  `created_date` datetime DEFAULT NULL,
  `created_by` varchar(255) DEFAULT NULL,
  `created_name` varchar(255) DEFAULT NULL,
  `updated_date` datetime DEFAULT NULL,
  `updated_by` varchar(255) DEFAULT NULL,
  `updated_name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COMMENT='菜单表_菜单相关数据';

你可能感兴趣的:(mysql中sql_mode=only_full_group_by下的group by)