当前位置:首页 > 数据库 > MYSQL-group by 用法解析

MYSQL-group by 用法解析

2022年11月09日 19:31:15数据库8

MYSQL-group by 用法解析

group by 用法

​ group by语法可以根据给定数据列的每个成员对查询结果进行分组统计,最终得到一个分组汇总表。
SELECT子句中的列名必须为分组列或列函数。列函数对于GROUP BY子句定义的每个组各返回一个结果。
某个历史观影进度记录表结构和数据如下:
MYSQL-group by 用法解析 _ JavaClub全栈架构师技术笔记

例如,我想列出每个人的最新一条观影记录,sql语句如下:

SELECT user_id, MAX(updated_at) AS MAXIMUM
FROM movie_histories
GROUP BY user_id;

查询结果如下:
MYSQL-group by 用法解析 _ JavaClub全栈架构师技术笔记
解释一下这个结果:

  • 1、满足“SELECT子句中的列名必须为分组列或列函数”,因为SELECT有GROUP BY user_id中包含的列user_id。
  • 2、“列函数对于GROUP BY子句定义的每个组各返回一个结果”,根据用户分组,对每个用户返回一个结果,就是每个用户的最后观影时间。
    注意:计算的是每个用户(由 GROUP BY 子句定义的组)而不是整个表的 MAX(updated_at)。

将 WHERE 子句与 GROUP BY 子句一起使用

分组查询可以在形成组和计算列函数之前使用where筛选记录。必须在GROUP BY 子句之前指定 WHERE 子句。
例如,查询用户今日每个电影的最近观影时间

select movie_id,user_id,MAX(updated_at) 
from `movie_histories`
where `created_at` > '2020-12-17 00:00:00)'
group by `movie_id` ,`user_id`;

查询结果如下:
MYSQL-group by 用法解析 _ JavaClub全栈架构师技术笔记
查询结果如下:

注意:在SELECT语句中指定的每个列名也在GROUP BY子句中提到。未在这两个地方提到的列名将产生错误。
GROUP BY子句对movie_id,user_id的每个唯一组合各返回一行。

在GROUP BY子句之后使用HAVING子句

  1. where条件会在分组和聚集前执行,having在分组后执行

  2. where直接针对数据库字段进行筛选,having可以根据聚合函数进行筛选(也可针对字段进行过滤,但是需要先select该字段)
    例如:寻找今日数超过2个的部门的最高和最低薪水:
    例如:寻找观看电影数量超过2部的用户

select movie_id,user_id,MAX(updated_at) 
from `movie_histories`
group by `movie_id` ,`user_id`
having count(*)>2;

查询结果如下:
MYSQL-group by 用法解析 _ JavaClub全栈架构师技术笔记

需求实例:

电影记录表movie_history是根据剧集来记录的用户浏览记录,以便用户挑选了多集观看时,能记录每一集的观看进度。也就是在表记录中,[user_id,movie_id,series_id]才是一组唯一键;
但是这里需要定位用户最近一次观看某部电影的进度记录;
这里的就需要根据movie_id来分组,但是分组之后,SELECT子句中的列名必须为分组列或列函数,就无法查询整条数据记录,这里的一个方法是使用where in 来实现。

select * from movie_histories
where (movie_id,updated_at)
in (
  select movie_id ,max(updated_at) 
  from `movie_histories`
  where `user_id`= 450
  group by `movie_id`
  );

对应的Eloquent查询为:

MovieHistory::whereIn(DB::raw('(movie_id,updated_at)'),function ($query)use($user) {
     
                    $query->select('movie_id',DB::raw('max(updated_at)'))
                        ->from('movie_histories')
                        ->where('user_id', $user->id)
                        ->groupBy('movie_id');
                }
            );

作者:livovil
来源链接:https://blog.csdn.net/livovil/article/details/111474335

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/database/69010.html

标签: group by
分享给朋友:

“MYSQL-group by 用法解析” 的相关文章

MySQL中 (GROUP BY 用法)和(ORDER BY用法)

MySQL中 (GROUP BY 用法)和(ORDER BY用法)

一、GROUP BY(分组) 例子: SELECT sum(id) as aa_id, max(id) as m_id, message FROM device_shadow_log GROUP BY message ORDER BY aa_id DESC 1...

MySQL的分组查询group by

group by (1)、group by的含义:将查询结果按照1个或多个字段进行分组,字段值相同的为一组。 (2)、group by可用于单字段分组,也可用于多个字段分组。 复制代码select * from employee; +----...

mysql分组查询教程

在 MySQL 中,GROUP BY 关键字可以根据一个或多个字段对查询结果进行分组。 使用 GROUP BY 关键字的语法格式如下: GROUP BY ,, ... ... 其中,“字段名”表示需要分组的字段名称,多个字段时用逗号隔开...

group by分组筛选

我们在MySQL做查询时,经常需要用到 group by 分组来筛选查询 相信做后端的朋友应该遇到过,有时候需要对分组的结果再进行过滤,这时候where用不了,那么该如何解决呢? 解决方法: 用 having 处理,即having后面接筛选的条件,写法的wher...

mysql group by 用法解析(详细)

group by 用法解析 group by语法可以根据给定数据列的每个成员对查询结果进行分组统计,最终得到一个分组汇总表。 SELECT子句中的列名必须为分组列或列函数。列函数对于GROUP BY子句定义的每个组各返回一个结果。 某个员工信息表结构和数据如下:   i...

MySQL5.7.5及以上执行group by报错

MySQL5.7.5及以上执行group by报错

MySQL执行报错: [Err] 1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'cerebrum_sit.s.id' wh...

SQL: select非group by的字段

使用group by查找或删除重复行,请参考    SQL:查找或删除重复行 在含有Group by子句的查询语句中,对select关键字后的目标列,存在以下规律 使用group by 时,select 涉及的列要么是参...

优化 Group By -- MYSQL一次千万级连表查询优化(转)

优化 Group By -- MYSQL一次千万级连表查询优化(转)

概述: 交代一下背景,这算是一次项目经验吧,属于公司一个已上线平台的功能,这算是离职人员挖下的坑,随着数据越来越多,原本的SQL查询变得越来越慢,用户体验特别差,因此SQL优化任务交到了我手上。  这个SQL查询关联两个数据表,一个是攻击IP用户表主要是记录IP的...

mysql中 group by的使用事项

mysql中 group by的使用事项

1、概述 “Group By”从字面意义上理解就是根据“By”指定的规则对数据进行分组,所谓的分组就是将一个“数据集”划分成若干个“小区域”,然后针对若干个“小区域”进行数据处理。 2、原始表 3、简单Group By 示例1 select...

关于MySql使用group by

MySql执行select AreaClusterCode,AreaClusterDesc,SubRegionDesc,RegionDesc from u_area group by AreaClusterCode会报错,是因为sql_mode设置了ON...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。