Mysql查找删除重复行

简介: Mysql查找删除重复行

测试准备

-- 准备测试数据库和数据表,并写入初始数据
mysql> create database demo;
mysql> use demo;
mysql> create table mytable (id int not null primary key,  day date not null);
mysql> insert into mytable(id, day) values(1, "2018-04-14");
mysql> insert into mytable(id, day) values(2, "2018-04-15");
mysql> insert into mytable(id, day) values(3, "2018-04-16");
mysql> insert into mytable(id, day) values(4, "2018-04-16");
mysql> insert into mytable(id, day) values(5, "2018-04-15");
mysql> insert into mytable(id, day) values(6, "2018-04-16");
mysql> select * from mytable;
+----+------------+
| id | day        |
+----+------------+
|  1 | 2018-04-14 |
|  2 | 2018-04-15 |
|  3 | 2018-04-16 |
|  4 | 2018-04-16 |
|  5 | 2018-04-15 |
|  6 | 2018-04-16 |
+----+------------+

分组查询


-- 分组查询,计算每个 day 的数量
mysql> select day, count(*) from mytable group by day;
+------------+----------+
| day        | count(*) |
+------------+----------+
| 2018-04-14 |        1 |
| 2018-04-15 |        2 |
| 2018-04-16 |        3 |
+------------+----------+
-- 只显示相同 day 数量大于 1 的数据
mysql> select day, count(*) from mytable group by day having count(*)>1;
+------------+----------+
| day        | count(*) |
+------------+----------+
| 2018-04-15 |        2 |
| 2018-04-16 |        3 |
+------------+----------+

WHERE 子句过滤的是分组之前的行

HAVING 子句过滤的是分组之后的行


创建临时表

-- 创建临时表,并插入 id 最小的记录
mysql> create temporary table temptable(day date not null, min_id int not null);
mysql> insert into temptable(day, min_id) select day, min(id) from mytable group by day having count(*)>1;
mysql> select * from temptable;
+------------+--------+
| day        | min_id |
+------------+--------+
| 2018-04-15 |      2 |
| 2018-04-16 |      3 |
+------------+--------+

删除重复项

-- 删除 id 不在临时表中 day 重复的记录,即保留了相同 day 值,id 较小的记录
mysql> delete from mytable where exists(
    -> select * from temptable where temptable.day = mytable.day and temptable.min_id <> mytable.id);
mysql> select * from mytable;
+----+------------+
| id | day        |
+----+------------+
|  1 | 2018-04-14 |
|  2 | 2018-04-15 |
|  3 | 2018-04-16 |
+----+------------+

参考


技术栈之Mysql】SQL查找删除重复行

How to find duplicate rows with SQL

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
关系型数据库 MySQL 数据库
docker MySQL删除数据库时的错误(errno: 39)
docker MySQL删除数据库时的错误(errno: 39)
249 0
|
存储 关系型数据库 MySQL
mysql添加和删除数据库以及数据类型
mysql添加和删除数据库以及数据类型
189 1
|
关系型数据库 MySQL PHP
MySQL 删除数据库
MySQL 删除数据库
|
关系型数据库 MySQL 数据库
MySql distinct 剔除查询结果重复行
MySql distinct 剔除查询结果重复行
152 0
|
SQL 关系型数据库 MySQL
mysql的DML进阶,分页查找,SQL约束,多表操作学习
mysql的DML进阶,分页查找,SQL约束,多表操作学习
mysql的DML进阶,分页查找,SQL约束,多表操作学习
|
SQL 关系型数据库 MySQL
MYSQL递归查找菜单节点的所有子节点
MYSQL递归查找菜单节点的所有子节点
MYSQL递归查找菜单节点的所有子节点
|
存储 运维 关系型数据库
头大了,Mysql写入数据十几秒后被自动删除了
事情是这样的,在公司内部新开发了一个功能还没有上线,目前部署在测试环境,Node服务会开启一个定时任务,每5分钟会处理好一部分数据写入到mysql数据库中。
295 0
头大了,Mysql写入数据十几秒后被自动删除了
|
SQL 关系型数据库 MySQL
软件开发入门教程网之MySQL 删除数据库
使用普通用户登陆 MySQL 服务器,你可能需要特定的权限来创建或者删除 MySQL 数据库,所以我们这边使用 root 用户登录,root 用户拥有最高权限。
|
SQL 关系型数据库 MySQL
删除 MySQL | 学习笔记
快速学习删除 MySQL.
184 0
删除 MySQL | 学习笔记
|
关系型数据库 MySQL
MySQL基础-删除/更新行为
添加了外键之后,再删除父表数据时产生的约束行为,我们就称为删除/更新行为。具体的删除/更新行为有以下几种:
339 0

推荐镜像

更多