mysql中sql_mode=only_full_group_b
2021-01-19 本文已影响0人
燃灯道童
背景:这是一个菜单表,类型有目录、菜单、按钮。
需求:根据类型分组查看组内最大的id和菜单标题。
![](https://img.haomeiwen.com/i18422753/a841a7c645395c4e.png)
问题:sql_mode=only_full_group_by按平常的写法报错(如图)。
![](https://img.haomeiwen.com/i18422753/ac69bbc1288a75ef.png)
解决方案:
1.any_value包裹住没有参与分组的字段。
SELECT max(id), type,any_value(title) FROM admin_menu GROUP BY type
![](https://img.haomeiwen.com/i18422753/bc8482ce7b819351.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;
![](https://img.haomeiwen.com/i18422753/722becd0d1eabe0c.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='菜单表_菜单相关数据';