背景:這是一個(gè)菜單表,類型有目錄、菜單、按鈕。
需求:根據(jù)類型分組查看組內(nèi)最大的id和菜單標(biāo)題。

數(shù)據(jù)示例.png
問(wèn)題:sql_mode=only_full_group_by按平常的寫法報(bào)錯(cuò)(如圖)。

報(bào)錯(cuò)圖.png
解決方案:
1.any_value包裹住沒(méi)有參與分組的字段。
SELECT max(id), type,any_value(title) FROM admin_menu GROUP BY type

查詢結(jié)果1.png
2.關(guān)聯(lián),先查詢出來(lái)重復(fù)類型中的最大id,再與自身關(guān)聯(lián)查詢出所要字段。
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;

查詢結(jié)果2.png
3.WITH AS,先分組查詢出來(lái)的結(jié)果作為臨時(shí)表再關(guān)聯(lián)原表查詢出來(lái)響應(yīng)信息。
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才開(kāi)始支持,僅做示例。
總結(jié):
1.any_value包裹住沒(méi)有參與分組的字段。
2.關(guān)聯(lián),先查詢出來(lái)重復(fù)類型中的最大id,再與自身關(guān)聯(lián)查詢出所要字段。
3.WITH AS,先分組查詢出來(lái)的結(jié)果作為臨時(shí)表再關(guān)聯(lián)原表查詢出來(lái)響應(yīng)信息。
建表語(yǔ)句:
##建表語(yǔ)句
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 '菜單標(biāo)題',
`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 '權(quán)限',
`is_del` varchar(1) DEFAULT NULL COMMENT '刪除狀態(tài)',
`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='菜單表_菜單相關(guān)數(shù)據(jù)';