mysql distinct 和 group by 去重

这篇具有很好参考价值的文章主要介绍了mysql distinct 和 group by 去重。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

标题mysql distinct 和 group by 去重

一、先说结论:

MySQL中常用去重复数据的方法是使用 distinct 或者 group by

group by 分组后,如果没有对分组后的数据进行操作,如使用聚合函数/分组函数:count、sum、avg、max 、min,分组后直接显示该分组的第一条数据。

二、接下来看示例:

说明:
有一个事件评论表,针对每个事件,用户都可以发表评论,每发表一次评论,会生成一条记录

需求:
查询出每个事件中的最新评论

Sql脚本:

DROP TABLE IF EXISTS t1;
CREATE TABLE t1
(
    event_id   VARCHAR(32) NOT NULL COMMENT '事件id',
    save_id    VARCHAR(32) NOT NULL COMMENT '评论编号(评论一次生成一个)',
    remark     VARCHAR(512) COMMENT '评论',
    created_by VARCHAR(32) COMMENT '创建者',
    created_at DATETIME    NOT NULL COMMENT '创建时间',
    PRIMARY KEY (event_id, save_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT = '事件评论表';

insert into t1(event_id,save_id,remark,created_by,created_at) values
('33382DC38943452787801511501F82','ACAC06C970484598BEC213552CC2445C','666','Ken','2023-01-01 09:52:03')
, ('33382DC38943452787801511501F82','DDAFBB48ECBA4BC5B8DD560F97E813DD','牛','Bebe','2023-01-02 13:36:25')
, ('3C9E84678DA84DFDA3AA0F4669E7DFA3','3F0921BC070F49D5801B169488113AEE','手动狗头-','Merry','2023-02-05 22:48:42')
, ('9612173DE985409D8CC7DEC9AE4D925','141CC3D1F95B47BA9D5DAAEDB66CA4BE','已阅','Nancy','2023-03-07 08:01:01')
, ('9612173DE985409D8CC7DEC9AE4D925','4747F063294447B6A469D4ED272AF1KL','已阅+1','Bebe','2023-03-08 10:32:30')
, ('9612173DE985409D8CC7DEC9AE4D925','82F18CCDDB194BA18D3911C387D4B326','已阅+2','Alan','2023-03-08 10:32:30');

mysql distinct 和 group by 去重

步骤:
1、查询出每个事件的最大创建时间(最新记录)

SELECT event_id, MAX(created_at) AS created_at
FROM t1
GROUP BY event_id;

mysql distinct 和 group by 去重

2、内联查询,查询出其他数据

SELECT
	   DATA.*
FROM (
		SELECT event_id, MAX(created_at) AS created_at
		FROM t1
		GROUP BY event_id
	) LATEST
	INNER JOIN (
		SELECT *
		FROM t1
	) DATA
		ON LATEST.event_id = DATA.event_id AND LATEST.created_at = DATA.created_at;

mysql distinct 和 group by 去重

发现问题:
          看起来似乎没有问题,但是发现却查出了4条记录
          虽然在上一步中,取MAX(created_at) 只有3条记录,但这里进行内联查询时会有4条记录

          因为最后2个评论的创建时间是相同的,
          如果说只取每个事件中的最新评论,其实这2条数据任一即可,因此需要去重!

解决问题:
          在语句最后面加上 GROUP BY 进行去重

最终sql:

SELECT
	   DATA.*
FROM (
		SELECT event_id, MAX(created_at) AS created_at
		FROM t1
		GROUP BY event_id
	) LATEST
	INNER JOIN (
		SELECT *
		FROM t1
	) DATA
		ON LATEST.event_id = DATA.event_id AND LATEST.created_at = DATA.created_at
-- 去重
GROUP BY DATA.event_id, DATA.created_at;

mysql distinct 和 group by 去重文章来源地址https://www.toymoban.com/news/detail-444319.html

到了这里,关于mysql distinct 和 group by 去重的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Mysql 数据库去重(distinct)

    有时需要查询出某个字段不重复的记录,这时可以使用mysql提供的distinct这个来过滤重复的记录,但是实际中我们往往用distinct来返回不重复字段的条数(count(distinct id)),其原因是distinct只能返回他的目标字段,而无法返回其他字段 distinct 这种方式会将全部内容存储在一

    2024年02月13日
    浏览(38)
  • Elasticsearch按某个字段去重-实现group by效果

    已知es中存储了一张学生课程信息宽表,里边包含有student_name、student_id、teacher_id、课程信息等字段。 现在根据学生姓名或者班级ID,得出学生所在班级的所有授课教师信息。  既然是明细宽表,里边的教师的信息必然是有重复的,因此我们需要查询teacher_id的集合并去重,对

    2024年02月12日
    浏览(43)
  • 【flink番外篇】9、Flink Table API 支持的操作示例(6)- 表的聚合(group by、Distinct、GroupBy/Over Window Aggregation)操作

    一、Flink 专栏 Flink 专栏系统介绍某一知识点,并辅以具体的示例进行说明。 1、Flink 部署系列 本部分介绍Flink的部署、配置相关基础内容。 2、Flink基础系列 本部分介绍Flink 的基础部分,比如术语、架构、编程模型、编程指南、基本的datastream api用法、四大基石等内容。 3、

    2024年02月02日
    浏览(34)
  • mysql GROUP BY 怎么 order by 排序

    在 MySQL 中使用 GROUP BY 子句时,如果需要对结果进行排序,可以使用 ORDER BY 子句来对分组后的结果进行排序。 ORDER BY 子句应该放在 GROUP BY 子句之后,使用逗号来分隔需要排序的列,并在排序列后指定排序顺序。例如: 在这个例子中,SELECT 语句选择了表 table1 中的列 column1 和

    2024年02月16日
    浏览(53)
  • Mysql group by使用示例

    总数据: 索引情况:

    2024年02月11日
    浏览(33)
  • MySQL Group by 优化查询

      使用的是临时表,加文件排序(数据量小用内存排序) 注意:这里加的索引一般不会仅仅是group by后面的字段索引(大多数多少条件是一个以 该字段开头联合索引 ,方便使用覆盖索引或者索引下推)。如果该字段是一个varchar类型, 最好 加个int冗余字段,建立索引的字段,

    2024年02月05日
    浏览(44)
  • MySQL 中 Group By 的用法

    Group By 是一种 SQL 查询语句,常用于根据一个或多个列对查询结果进行分组。在 Group By 子句中指定的列将成为分组依据,而在 Select 子句中指定的列必须是聚合函数(例如 SUM、AVG、COUNT 等)或分组列。 Group By 的语法如下:  SELECT column_name(s) FROM table_name WHERE condition GROUP BY co

    2024年02月13日
    浏览(49)
  • MySQL——GROUP BY详解与优化

    在 MySQL 中,GROUP BY用于将具有指定列中相同值的行分组在一起。这是在处理大量数据时非常有用的功能,允许对数据进行分类和聚合。 以下是GROUP BY子句的基本语法: \\\"\\\"\\\" \\\"\\\"\\\" 其中,col1, col2, ...是要分组的列名,aggregate_function是用于聚合数据的函数,如SUM, AVG, MAX, MIN等。table_

    2024年02月16日
    浏览(34)
  • MySQL查询分组Group By原理分析

    日常开发中,我们经常会使用到group by: 你是否知道group by的工作原理呢? group by和having有什么区别呢? group by的优化思路是怎样的呢? 使用group by有哪些需要注意的问题呢? 使用group by的简单例子 group by 工作原理 group by + where 和 having的区别 group by 优化思路 group by 使用注意

    2023年04月16日
    浏览(46)
  • MongoDB——去重函数Distinct

    MongoDB的distinct方法可以用于检索指定字段的唯一值,以下是对MongoDB distinct的阐述: 一、distinct方法的语法 distinct方法包含三个参数,field表示要检索唯一值的字段,query表示检索时使用的查询语句,options包括projection和sort等选项。 二、distinct的基本用法 在collection中使用disti

    2024年01月24日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包