`
jerrylsxu
  • 浏览: 12604 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

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  | 123

|  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) 

1
0
分享到:
评论

相关推荐

    mysql查找删除表中重复数据方法总结

    本文将详细介绍如何在MySQL中查找并删除重复数据。 首先,我们需要识别哪些数据是重复的。假设我们有一个名为`my_table`的表,其中包含`column1`和`column2`等字段,可能存在重复数据。使用`GROUP BY`和`HAVING`...

    mysql查找删除重复数据并只保留一条实例详解

    本文将详细介绍如何在MySQL中查找并删除重复数据,同时只保留其中一条,具体以实例进行解析。 首先,假设我们有一个名为`test`的表格,包含以下字段:`school_id`、`school_name`、`total_student`和`test_takers`...

    谈MySQL中重复行的查找删除.pdf

    本文主要探讨了在MySQL中如何查找并删除重复行,这对于维护数据库的整洁性和提高查询效率有着重要的作用。 首先,我们需要明确什么是重复行。在MySQL中,如果表中的某一行与其他行在特定列上的值完全相同,那么这些...

    MySQL 如何查找并删除重复记录的实现

    今天我们就来谈谈如何查找 MySQL 表中的重复数据以及如何删除这些重复的记录。 创建示例表 首先创建一个示例表 people 并生成一些数据: drop table if exists people; create table people ( id int auto_...

    mysql 数据表中查找重复记录

    在MySQL数据库管理中,有时我们需要找出数据表中的重复记录,以确保数据的准确性和一致性。在给定的标题和描述中,我们关注的核心知识点是...以上提供的方法和技巧可以帮助你更有效地查找、分析和解决重复数据的问题。

    MySQL 查询重复内容只显示一条

    4. **删除重复数据**:如果你希望彻底删除重复数据,只保留一条,可以使用`DISTINCT`关键字创建一个新的表,或者使用`DELETE`语句结合子查询。但请注意,删除操作应谨慎进行,以免丢失重要信息。例如: ```sql ...

    MySQL查询重复数据(删除重复数据保留id最小的一条为唯一数据)

    最近在做一个批量数据导入到MySQL数据库的功能,从批量导入就可以知道,这样的数据在插入数据库之前是不会进行重复判断的,因此只有在全部数据导入进去以后在执行一条语句进行删除,保证数据唯一性。 下面话不多说了...

    MySQL 处理重复数据的方法(防止、删除)

    处理MySQL中的重复数据涉及多个层面,包括在设计阶段通过设置主键和唯一索引来预防,使用`INSERT IGNORE`或`REPLACE INTO`来处理插入时的重复,以及利用`GROUP BY`, `HAVING`, `DISTINCT`等查询构造来查找和删除重复...

    shell脚本操作mysql数据库删除重复的数据

    总结一下,本篇文章主要介绍了如何利用shell脚本与MySQL结合,有效地查找并删除数据库中的重复数据。这包括了连接MySQL服务器的参数设置,使用SQL查询来定位重复数据,以及在循环中执行删除操作。通过这种方式,我们...

    Delphi找出数据库重复数据..rar

    在Delphi中查找重复数据,主要步骤如下: 1. **建立数据库连接**:使用TDBXConnection组件连接到数据库,配置合适的连接字符串以确保能够访问目标数据库。 2. **创建数据集对象**:根据需要,选择TClientDataSet或...

    MySQL根据某一个或者多个字段查找重复数据的sql语句

    针对单个字段查找并删除重复记录的情况,例如根据`peopleId`字段,可以执行以下操作: 1. 查找重复记录: ```sql SELECT * FROM people WHERE peopleId IN ( SELECT peopleId FROM people GROUP BY peopleId ...

    sql数据库一些查找删除方法.docx

    在SQL数据库管理中,...以上就是一些关于SQL数据库中查找和删除重复数据的方法,以及如何更改表所属用户的技巧。在实际操作中,应根据具体数据库类型(如MySQL、SQL Server、Oracle等)和数据量大小选择合适的方法。

    mysql查询表里的重复数据方法

    在MySQL数据库管理中,有时我们需要查询并处理表中的重复数据。本文将详细介绍如何利用SQL语句来检测和处理这些重复信息。 首先,我们要理解“重复数据”是指在某个或某些字段上具有相同值的记录。以下是一些常用的...

    MySQL 中查找含有目标字段的表的方法

    8. **mysql查找删除重复数据并只保留一条实例详解**:可以先使用`GROUP BY`和`MIN/MAX`或`COUNT(*)`找出重复记录,然后根据业务需求决定保留哪一条,最后通过`DELETE`或`UPDATE`语句进行处理。 了解这些相关知识点...

    MySQL 处理重复数据

    删除重复数据通常需要创建临时表来存储唯一记录,然后清空原始表并重新插入唯一数据。例如: ```sql CREATE TABLE tmp SELECT last_name, first_name, MIN(id) as id FROM person_tbl GROUP BY last_name, first_...

    删除数据库表中的父节点以及其子节点

    这个存储过程首先将指定的父节点ID存入临时表`childQueue`,然后在循环中不断删除队列中的节点并查找其子节点,将子节点加入队列,直到队列为空。这样就确保了所有子节点都被删除,最后父节点也被安全移除。 当然,...

    MySQL重新安装or彻底清除

    - 在 **C:\Program Files** 或 **C:\Program Files (x86)** 中,查找并删除名为MySQL的文件夹。 - 在 **C:\ProgramData** 中,同样查找并删除MySQL相关的文件夹。 - 在 **C:\Users\[用户名]\AppData\Roaming** 中,...

Global site tag (gtag.js) - Google Analytics