Mysql中查找并删除重复数据的方法
(一)单个字段
1、查找表中多余的重复记录,根据(question_title)字段来判断
代码如下 复制代码
select * from questions where question_title in (select question_title from people group by question_title having count(question_title) > 1)
2、删除表中多余的重复记录,根据(question_title)字段来判断,只留有一个记录
代码如下 复制代码
delete from questions
where peopleId in (select peopleId from people group by peopleId having count(question_title) > 1)
and min(id) not in (select question_id from questions group by question_title having count(question_title)>1)
(二)多个字段
删除表中多余的重复记录(多个字段),只留有rowid最小的记录
代码如下 复制代码
DELETE FROM questions WHERE (questions_title,questions_scope) IN (SELECT questions_title,questions_scope FROM questions GROUP BY questions_title,questions_scope HAVING COUNT(*) > 1) AND question_id NOT IN (SELECT MIN(question_id) FROM questions GROUP BY questions_scope,questions_title HAVING COUNT(*)>1)
用上述语句无法删除,创建了临时表才删的,求各位达人解释一下。
代码如下 复制代码
CREATE TABLE tmp AS SELECT question_id FROM questions WHERE (questions_title,questions_scope) IN (SELECT questions_title,questions_scope FROM questions GROUP BY questions_title,questions_scope HAVING COUNT(*) > 1) AND question_id NOT IN (SELECT MIN(question_id) FROM questions GROUP BY questions_scope,questions_title HAVING COUNT(*)>1);
DELETE FROM questions WHERE question_id IN (SELECT question_id FROM tmp);
DROP TABLE tmp;
(三) 存储过程
代码如下 复制代码
declare @max integer,@id integer
declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) >; 1
open cur_rows
fetch cur_rows into @id,@max
while @@fetch_status=0
begin
select @max = @max -1
set rowcount @max
delete from 表名 where 主字段 = @id
fetch cur_rows into @id,@max
end
close cur_rows
set rowcount 0
例,
数据库版本 Server version: 5.1.41-community-log MySQL Community Server (GPL)
例1,表中有主键(可唯一标识的字段),且该字段为数字类型
例1测试数据
代码如下 复制代码
/* 表结构 */
DROP TABLE IF EXISTS `t1`;
CREATE TABLE IF NOT EXISTS `t1`(
`id` INT(1) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(20) NOT NULL,
`add` VARCHAR(20) NOT NULL,
PRIMARY KEY(`id`)
)Engine=InnoDB;
/* 插入测试数据 */
INSERT INTO `t1`(`name`,`add`) VALUES
('abc',"123"),
('abc',"123"),
('abc',"321"),
('abc',"123"),
('xzy',"123"),
('xzy',"456"),
('xzy',"456"),
('xzy',"456"),
('xzy',"789"),
('xzy',"987"),
('xzy',"789"),
('ijk',"147"),
('ijk',"147"),
('ijk',"852"),
('opq',"852"),
('opq',"963"),
('opq',"741"),
('tpk',"741"),
('tpk',"963"),
('tpk',"963"),
('wer',"546"),
('wer',"546"),
('once',"546");
SELECT * FROM `t1`;
+----+------+-----+
| id | name | add |
+----+------+-----+
| 1 | abc | 123 |
| 2 | abc | 123 |
| 3 | abc | 321 |
| 4 | abc | 123 |
| 5 | xzy | 123 |
| 6 | xzy | 456 |
| 7 | xzy | 456 |
| 8 | xzy | 456 |
| 9 | xzy | 789 |
| 10 | xzy | 987 |
| 11 | xzy | 789 |
| 12 | ijk | 147 |
| 13 | ijk | 147 |
| 14 | ijk | 852 |
| 15 | opq | 852 |
| 16 | opq | 963 |
| 17 | opq | 741 |
| 18 | tpk | 741 |
| 19 | tpk | 963 |
| 20 | tpk | 963 |
| 21 | wer | 546 |
| 22 | wer | 546 |
| 23 | once | 546 |
+----+------+-----+
rows in set (0.00 sec)
查找id最小的重复数据(只查找id字段)
代码如下 复制代码
/* 查找id最小的重复数据(只查找id字段) */
SELECT DISTINCT MIN(`id`) AS `id`
FROM `t1`
GROUP BY `name`,`add`
HAVING COUNT(1) > 1;
+------+
| id |
+------+
| 1 |
| 12 |
| 19 |
| 21 |
| 6 |
| 9 |
+------+
rows in set (0.00 sec)
查找所有重复数据
代码如下 复制代码
/* 查找所有重复数据 */
SELECT `t1`.*
FROM `t1`,(
SELECT `name`,`add`
FROM `t1`
GROUP BY `name`,`add`
HAVING COUNT(1) > 1
) AS `t2`
WHERE `t1`.`name` = `t2`.`name`
AND `t1`.`add` = `t2`.`add`;
+----+------+-----+
| id | name | add |
+----+------+-----+
| 1 | abc | 123 |
| 2 | abc | 123 |
| 4 | abc | www.111cn.net|
| 6 | xzy | 456 |
| 7 | xzy | 456 |
| 8 | xzy | 456 |
| 9 | xzy | 789 |
| 11 | xzy | 789 |
| 12 | ijk | 147 |
| 13 | ijk | 147 |
| 19 | tpk | 963 |
| 20 | tpk | 963 |
| 21 | wer | 546 |
| 22 | wer | 546 |
+----+------+-----+
rows in set (0.00 sec)
更多详细内容请查看:http://www.111cn.net/database/mysql/56725.htm
转载于:https://www.cnblogs.com/alibai/p/3510061.html
Mysql中查找并删除重复数据的方法相关推荐
- MySQL中查询、删除重复记录的方法大全
查找所有重复标题的记录: select title,count(*) as count from user_table group by title having count>1; SELECT ...
- mysql删除重复文章标题_MySQL中查询、删除重复记录的方法大全
前言 本文主要给大家介绍了关于MySQL中查询.删除重复记录的方法,分享出来供大家参考学习,下面来看看详细的介绍: 查找所有重复标题的记录: 一.查找重复记录 1.查找全部重复记录 2.过滤重复记录( ...
- mysql去掉两个最高分_MySQL中查询、删除重复记录的方法大全
前言 本文主要给大家介绍了关于MySQL中查询.删除重复记录的方法,分享出来供大家参考学习,下面来看看详细的介绍: 查找所有重复标题的记录: select title,count(*) as coun ...
- oracle 视图去重复,CSS_Oracle几种查找和删除重复记录的方法总结,平时工作中可能会遇到当试图 - phpStudy...
Oracle几种查找和删除重复记录的方法总结 平时工作中可能会遇到当试图对库表中的某一列或几列创建唯一索引时,系统提示 ORA-01452 :不能创建唯一索引,发现重复记录. 下面总结一下几种查找和删 ...
- 在Linux中查找和删除重复文件的4种方法
大神教你在Linux中查找和删除重复文件的4种方法 在本教程中,您将学习如何使用rdfind和fdupes命令行工具以及称为DupeGuru和FSlint的GUI工具在Linux中查找和删除重复文件. ...
- Linux查找文本中的重复项,2在Linux中查找和删除重复文件的有用工具
如果您有从互联网下载各种内容的习惯,组织您的主目录甚至系统可能会特别困难. 通常,您可能会发现已下载相同的mp3,pdf,epub(以及所有其他文件扩展名)并将其复制到不同的目录中. 这可能会导致您的 ...
- 数据库中关于删除重复数据的方法的详解
相信大家在实际开发中在数据库方面都遇到过很多重复数据的问题,今天就和大家谈谈关于删除重复数据的方法,为了更加直观的和更容易的掌握方法我就从建表开始到插入重复数据到删除重复数据的核心sql语句给大家演示 ...
- Oracle几种查找和删除重复记录的方法总结
转载自:http://www.csdn.net/article/1970-01-01/278287 平时工作中可能会遇到当试图对库表中的某一列或几列创建唯一索引时,系统提示 ORA-01452 :不能 ...
- mysql怎么查找删除重复数据_Mysql中如何查找并删除重复数据
考试系统中做了一个用户导入试题功能,导致用户导入了很多重复的试题,我需要查询及删除一下重复的记录,于是有了这篇文章. (一)单个字段 1.查找表中多余的重复记录,根据(question_title)字 ...
最新文章
- linux mongodb开机启动脚本,Linux下设置MongoDB开机自启动
- 学python需要什么基础知识-学习python需要什么基础
- Map集合的几种遍历方式
- php页面调用时间戳,php--------获取当前时间、时间戳
- 利用 commit 理解镜像构成
- 查询计划中集的势(Cardinality)的计算
- SAP Spartacus 自定义 PageResolver 的用法
- C——用冒泡排序法、选择排序法对随机输入的10个整数从小到大排序
- Python 基本语法规则
- arcgis更改字段名_ArcGIS怎么修改属性表字段名称
- 春眠不觉晓,SQL 知多少?| 原力计划
- Java21天打卡Day8-break
- 大数据行业调研报告(最新版)
- 联想拯救者Legion Y7000 2020款(10代INTEL+GTX1650)安装ubuntu16.04(双系统)探索内核与显卡网卡驱动的关系
- 求二次方程的根 b^2-4ac的三种可能
- confluence 使用教程
- winform textbox行间距调整
- Android3d结构光,一文看懂OPPO Find X 3D结构光技术有多牛
- 在桌面上显示IP地址等信息
- 人工智能专家系统c语言,人工智能专家系统的简单实现
热门文章
- python rowspan_Python tkinter rowspan未正确调整元素大小
- 在计算机的通信子网中 其操作方式有两种,全国自考计算机网技术模拟试卷(八)及答案.doc...
- android 缩进轮播图,如何利用纯css实现图片轮播
- python 列表加入_加入python中的列表列表
- 网站不大但加载很慢怎么优化_博客网站首页加载优化
- 大数据平台CDH搭建
- 计算机考试单元格,计算机等级考试技巧在Excel中如何对单元格进行设置?
- linux查看通信延迟,低优先级进程延迟实时进程中的串行通信(Linux)
- 连接mysql次数_MySQL通过CONNECTION_CONTROL限制连接次数
- nedc和epa续航里程什么意思_NEDC、WLTP和EPA续航里程标准谁最真实?看比亚迪工程师怎么说...