group 与查询字段

需求

每周周一,统计菜单在过去一周,点击次数,和点击人数(同一个人访问多次按一次计算)

表及数据

日志表

CREATE TABLE `t_data_log` (

`id` varchar(50) NOT NULL COMMENT '主键id',

`operation_object` varchar(500) DEFAULT NULL COMMENT '操作对象-菜单ID',

`operation_description` varchar(1000) DEFAULT NULL COMMENT '操作描述',

`operation_user` varchar(50) DEFAULT NULL COMMENT '操作用户-用户ID',

`operation_time` datetime DEFAULT NULL COMMENT '操作时间',

PRIMARY KEY (`id`) USING BTREE,

KEY `idx_operation_user` (`operation_user`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='数据日志表';

菜单表

CREATE TABLE `t_menus` (

`id` varchar(50) NOT NULL COMMENT '主键id',

`menu_name` varchar(100) DEFAULT NULL COMMENT '菜单名称',

PRIMARY KEY (`id`) USING BTREE

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='菜单表';

select * from t_menus;

select * from t_data_log;

初始化数据

insert into t_menus values('1','融资模版');

insert into t_menus values('2','融资计划');

insert into t_menus values('3','融资机构');

insert into t_data_log values('1','1','查询','u_001','2024-04-29 17:07:37');

insert into t_data_log values('2','1','查询','u_002','2024-04-29 17:07:37');

insert into t_data_log values('3','2','查询','u_001','2024-04-29 17:07:37');

insert into t_data_log values('4','2','查询','u_002','2024-04-29 17:07:37');

insert into t_data_log values('5','2','查询','u_003','2024-04-29 17:07:37');

查询sql

group by 菜单ID

select m.menu_name ,count(*) count, count(distinct(l.operation_user)) person_count,

count(operation_user) person_count_total from t_menus m join t_data_log l on m.id = l.operation_object

group by m.id;

group by 菜单名称

select m.menu_name ,count(*) count, count(distinct(l.operation_user)) person_count,

count(operation_user) person_count_total from t_menus m join t_data_log l on m.id = l.operation_object

group by m.menu_name;

对比二者区别,分组字段不同,一个菜单ID一个菜单名称,查询结果是菜单名称,其他字段是count,疑问:依据mysql语法规则,查询结果字段必须包含在group 字段中

根据菜单ID分组,结果中是菜单名称,结果是否准确

结论:是准确的

select 字段不在group by的情况

1,聚合函数中字段可以不在group by中

像 sum()、avg()、max()、min()、count()这些聚合函数中的字段可以不在group by中。

2,group by的字段里有主键字段。

即菜单ID作为分组字段,菜单名称可不在group中

3,如果sql_mode参数中没有ONLY_FULL_GROUP_BY,是允许select字段可以不在group by字段里的也就是说

但是这种只是保证不报错,无法保证结果的准确性

复制代码
参考:

MySQL中select的字段只能取group by 中的字段吗?_mysql中查询条件只能有group by中字段-CSDN博客

https://www.toutiao.com/article/7044793472104399397/?app=news_article&timestamp=1720742979&use_new_style=1&req_id=2024071208093964E54949A5B564B919C4&group_id=7044793472104399397&wxshare_count=1&tt_from=weixin&utm_source=weixin&utm_medium=toutiao_android&utm_campaign=client_share&share_token=33e30f85-dfa0-4c85-abde-4444d46dd493&source=m_redirect

相关推荐
JAVA面经实录9173 小时前
Java企业级工程化·终极完整版背诵手册(无遗漏、全覆盖、面试+落地通用)
java·开发语言·面试
Flying pigs~~4 小时前
RAG智慧问答项目
数据库·人工智能·缓存·微调·知识库·rag
misL NITL5 小时前
mysql之如何获知版本
数据库·mysql
许彰午5 小时前
CacheSQL(二):主从复制——OpLog 环形缓冲区与故障自动恢复
java·数据库·缓存
2401_832365526 小时前
JavaScript中rest参数(...args)取代arguments的优势
jvm·数据库·python
Bat U6 小时前
JavaEE|多线程初阶(七)
java·开发语言
2301_779622416 小时前
Go语言怎么用信号量控制并发_Go语言semaphore信号量教程【入门】
jvm·数据库·python
2301_766283447 小时前
c++如何将控制台输出保存到文件_cout重定向到txt【详解】
jvm·数据库·python
北极的冰箱7 小时前
MySQL Ver 8.0.41 for macos14.7密码遗忘
数据库·mysql
XDH_CS7 小时前
MySQL 8.0 安装与 MySQL Workbench 使用全流程(超详细教程)
开发语言·数据库·mysql