复位试验自然环境,明确规定,寻找反复数据信息,寻找必须保存的数据信息,删掉反复数据信息。方式1,方式2,方式3,创作1,创作2,汇总。

MySQL中常常会碰到反复的数据信息,那麼在我们碰到反复的那时候的情况下,假如精准定位什么信息是有反复的纪录?怎么删除反复的数据信息?大家该怎么做呢?下面大家一步步来剖析一下碰到这种的状况后,该如何处理。mysql查询去重后的总数-数据库数据去重方法-第1张图片MySQL常常会碰到反复数据信息,那麼在我们碰到反复数据信息时,如果我们精准定位什么数据信息有重复记录呢?怎么删除反复数据信息?大家干什么呢下面,大家将逐渐剖析怎样解决这类状况。

该怎么办?

复位试验自然环境。

大家建立一个简易的表user_info,随后根据这一表剖析反复数据信息的解决。在其中,id是自增外键约束,名字,性別,年纪三列是大家分辨是不是为反复数据信息的重要。假如这三列的值同样,则这家银行数据信息被视作反复数据信息。建表语句如下所示:

CREATE TABLE `user_info` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `sex` varchar(255) DEFAULT NULL, `age` int(11) DEFAULT NULL, `remark` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;

复位数据信息如下所示:

INSERT INTO `tmp_test`.`user_info`(`id`, `name`, `sex`, `age`, `remark`) VALUES (1, 'A', '男', 22, '第一个A');INSERT INTO `tmp_test`.`user_info`(`id`, `name`, `sex`, `age`, `remark`) VALUES (2, 'B', '女', 33, '第一个B');INSERT INTO `tmp_test`.`user_info`(`id`, `name`, `sex`, `age`, `remark`) VALUES (3, 'C', '男', 44, '第一个C');INSERT INTO `tmp_test`.`user_info`(`id`, `name`, `sex`, `age`, `remark`) VALUES (4, 'D', '女', 55, '第一个D');INSERT INTO `tmp_test`.`user_info`(`id`, `name`, `sex`, `age`, `remark`) VALUES (5, 'A', '男', 22, '第二个A');INSERT INTO `tmp_test`.`user_info`(`id`, `name`, `sex`, `age`, `remark`) VALUES (6, 'B', '女', 33, '第二个B');INSERT INTO `tmp_test`.`user_info`(`id`, `name`, `sex`, `age`, `remark`) VALUES (7, 'C', '男', 44, '第二个C');INSERT INTO `tmp_test`.`user_info`(`id`, `name`, `sex`, `age`, `remark`) VALUES (8, 'D', '女', 55, '第二个D');INSERT INTO `tmp_test`.`user_info`(`id`, `name`, `sex`, `age`, `remark`) VALUES (9, 'E', '男', 18, '第一个E');INSERT INTO `tmp_test`.`user_info`(`id`, `name`, `sex`, `age`, `remark`) VALUES (10, 'A', '男', 22, '第三个A');INSERT INTO `tmp_test`.`user_info`(`id`, `name`, `sex`, `age`, `remark`) VALUES (11, 'B', '女', 33, '第三个B');INSERT INTO `tmp_test`.`user_info`(`id`, `name`, `sex`, `age`, `remark`) VALUES (12, 'F', '男', 15, '第一个F');

最终表中数据如下所示:mysql查询去重后的总数-数据库数据去重方法-第2张图片表格中的最后数据信息如下所示:

复位的数据测试。

确立的要求。

假定大家的需要是将第一个数据信息保留在反复数据信息中,而不是事后数据信息中。

也就是我的上边的这一表格中每一组反复数据信息中id最少的一行数据信息必须保存,别的较为大的id的无效的数据库行必须被删掉。自然如果是要保存id行较大的一行数据信息更为最终的数据库行也是就行了,只需在查看的情况下,略微改动一下SQL句子的min(id)或max(id)涵数就可以。mysql查询去重后的总数-数据库数据去重方法-第3张图片换句话说,大家以上中每一组反复数据信息中id最少的一行数据信息必须保存,别的id比较大的反复数据信息行必须删掉。自然,假如期待将较大的一行数据信息保存在id行和最终一行数据信息中,只须要在查看全过程中略微改动一下SQL句子的min(id)或max(id)涵数就可以。

开启全部

搜索反复数据信息。

根据大家以前复位的研究数据信息,大家一方面必须检查什么信息是反复数据信息的行。根据下边的SQL句子,我们可以获得那样的結果:在其中,存有反复数据信息的数据信息有四种,分别是a,b,c,d,下边的SQL能够用于找到什么数据信息行存有重复记录,并统计分析再现的频次。

select name, sex, age, count(*) as count -- 数据信息反复发生的频次from user_info group by name, sex, age having count(*) > 1;

反复数据信息在表格中的统计分析結果如下所示:mysql查询去重后的总数-数据库数据去重方法-第4张图片表格中反复数据信息的统计分析結果如下所示:

数据信息反复统计分析。

寻找要留下的数据信息。

我们知道怎么查什么信息是反复数据信息,那麼大家必须保存什么数据信息呢?应用下列SQL获得大家要想保存的数据库行:

select * from user_info where id in (select min(id) from user_info group by name, sex, age);

結果如下所示:mysql查询去重后的总数-数据库数据去重方法-第5张图片結果如下所示:

每一组反复数据信息中id值最少的数据库行。

上边的结论是大家必须最终多余的数据信息。这儿,在每一组反复数据信息中具备最小id的手机充电线在没有反复时被包含以内。

删掉反复数据信息。

方式一

这也是最懒的一种方法,也是最非常容易明白的一种方法,高效率也非常低。构思如下所示:mysql查询去重后的总数-数据库数据去重方法-第6张图片这也是最懒的方式,也是最非常容易明白的方式,高效率较为低。念头如下所示:

流程一mysql查询去重后的总数-数据库数据去重方法-第7张图片第一步

流程二mysql查询去重后的总数-数据库数据去重方法-第8张图片第二步

第三步

从里面的环节中,大家一步一步寻找必须删掉的数据信息。精准定位这种数据信息后,删掉时,只需将查看句子改成delete句子就可以。因此在我最后被那样删掉的情况下,大家的删除语句如下所示:

delete from user_info where (name,sex,age) in ( select x.* from ( -- 删掉的情况下,这儿要在包囊一层子查询select -- 查看反复数据信息中,name, sex, age的值name, sex, agefrom user_infogroup by name, sex, agehaving count(*) > 1) as x)and id not in (select min_id from ( -- 删掉的情况下,这儿要在包囊一层子查询select -- 查看反复数据信息中,最少的id值min(id) as min_idfrom user_info group by name, sex, agehaving count(*) > 1) as y);

留意:在上面的delete句子中,我们在2个where标准中的子查询句子之外包装盒了一层子查询,即上边的SQL句子中的x和y查看句子。包裝涂层的因素是程序流程中发生下列不正确信息:

1093 - You can't specify target table 'user_info' for update in FROM clause, Time: 0.084000s

发生以上不正确的因素是,在改动表时,子查询不可以是被改动的表,因而人们的解决方法是在子查询以外设定另一层查看句子。

方式2

上边方式一的构思是想办法寻找我们要删掉的统计数据是什么,随后我们在删掉的情况下,应用where标准去配对这种查看出去要删掉的数据库行,为此来做到删掉反复数据信息的目地。mysql查询去重后的总数-数据库数据去重方法-第9张图片上边方式一的构思是找到我们要删掉哪些数据信息,随后在卸载的情况下用where标准配对要删掉的数据库行,进而做到删掉反复数据信息的目地。

用不一样的方法处理。

这时候,大家何不换一个视角思索:与其说关心什么反复数据信息必须删掉,比不上关心什么数据信息必须保存。随后,在我们删掉它时,我们可以应用否认的方式没有大家必须保存的统计数据中。这并不恰好是大家必须删掉的统计数据吗?

那麼,大家来说必须保存什么数据信息呢?在每一组数据信息中,id值最少的行便是我们要保存的数据库行。我们不担心别的的。那麼怎样才可以获得那样的手机充电线呢?应用下列SQL句子获得自己必须保存的数据库行的全部id值:

select min(id) from user_info group by name, sex, age;

結果如下所示:

mysql查询去重后的总数-数据库数据去重方法-第10张图片即然获得了我们要保存的数据库行的id集,那麼在我们要删掉数据信息的where标准下,应用没有我们要保存的id集中化,并不是必须删掉的统计数据吗?删掉反复数据信息的句子如下所示:

delete from user_info where id not in(select min_id from (select min(id) as min_idfrom user_info group by name, sex, age) as x);

留意:为了更好地防止MySQL 1903不正确,大家仍在where标准的子查询中包裝了另一个子查询,也就是上边SQL中的as x查看句子。

方式3

mysql查询去重后的总数-数据库数据去重方法-第11张图片

找寻更合理和简便的方式。

提议根据关系2个表来高效率删掉数据信息。与你关系,关系的前提是大家分辨数据信息是不是反复数据信息的重要。此外,最重要的前提是2个表的id关系标准,这也是删掉预埋数据信息的重要标准。查看反复数据信息的SQL句子如下所示:

select a.*,b.* from user_info as a inner join user_info as b on a.name = b.name and a.sex = b.sex and a.age = b.ageand a.id > b.id;

結果如下所示:

mysql查询去重复后的数量-数据库查询数据信息去重复方式-第12张图片创作1

删掉反复数据信息的SQL句子如下所示:

delete a.*from user_info as a inner join user_info as b on a.name = b.name and a.sex = b.sex and a.age = b.ageand a.id > b.id;

创作2

除开上边的书写,也有此外一种书写,如下所示:

如下所示查看要删掉的反复数据信息SQL:

select * from user_info as a where a.id (select min(b.id) from user_info as b where a.name = b.nameand a.sex = b.sexand a.age = b.age);

删掉反复数据信息的SQL句子如下所示:

delete a.* from user_info as awhere a.id (selectmin(b.id)from (select * from user_info) as bwhere a.`name`= b.`name`and a.sex = b.sexand a.age = b.age);

引言

之上方式在MySQL中常会用以反复数据删除。针对别的数据库查询中的反复数据信息,删掉的构思是一样的,可是SQL句子的撰写很有可能略有不同。只需具备了构思,实际到SQL句子的撰写,试着几回就能取得成功。

mysql查询去重后的总数-数据库数据去重方法-第13张图片之上,期待能帮助你。

最终但一样关键的一点是,在删掉原始记录以前,请记牢备份数据原始记录。进而在不正确被删掉后数据信息没法修复。您还可以应用下列句子建立一个备份数据表,便于在删掉不正确后将数据修复到初始表格中。

create table user_info_bak as select * from user_info; --建立一个备份数据表truncate table user_info; -- 清除初始表格中的数据信息insert into user_info select * from user_info_bak; -- 从备份数据表格中把数据信息添加到初始表格中

根据以上实际操作,假如数据删除有误,能够将数据信息从user_info_bak修复到user_info表格中。

评论(0条)

刀客源码 游客评论