Mysql学习SQL查找删除重复的数据行
《Mysql学习SQL查找删除重复的数据行》要点: 本节内容: 一,如何查找重复行 本文采用这必定义,或许你对“重复”的定义比这复杂,你需要对sql做些修改.MYSQL学习 要用到的数据样本: ? insert into test(id,day) values(1,'2006-10-08');? insert into test(id,day) values(2,day) values(3,'2006-10-09');? ? select * from test;? +----+------------+? | id | day??????? |? +----+------------+? |? 1 | 2006-10-08 |? |? 2 | 2006-10-08 |? |? 3 | 2006-10-09 |? +----+------------+? 前面两行在day字段具有相同的值,因此如何将他们当做重复行,这里有一查询语句可以查找. +------------+----------+? | day??????? | count(*) |? +------------+----------+? | 2006-10-08 |??????? 2 |? | 2006-10-09 |??????? 1 |? +------------+----------+? 重复行的组大小大于1. +------------+----------+? | day??????? | count(*) |? +------------+----------+? | 2006-10-08 |??????? 2 |? +------------+----------+? 基本的技巧:根据具有相同值的字段分组,然后知显示大小大于1的组.MYSQL学习 二,为什么不能使用WHERE子句? 三,如何删除重复行 本文中,假设要保存的是第一行——id字段具有最小值的行,意味着你要删除其他的行.MYSQL学习 也许最简单的办法是通过临时表.MYSQL学习 尤其对于MYSQL,有些限制是不能在一个查询语句中select的同时update一个表. 简单起见,这里只用到了临时表的办法.MYSQL学习 任务:删除所有重复行,除了分组中id字段具有最小值的行.MYSQL学习 因此,需要找出大小大于1的分组,以及希望保存的行. 例句: ? insert into to_delete(day,min_id)? ?? select day,MIN(id) from test group by day having count(*) > 1;? ? select * from to_delete;? +------------+--------+? | day??????? | min_id |? +------------+--------+? | 2006-10-08 |????? 1 |? +------------+--------+? 有了这些数据,可以开始删除“脏数据”行了. 例句: ?? where exists(? ????? select * from to_delete? ????? where to_delete.day = test.day and to_delete.min_id <> test.id? ?? )? 四,如何查找多列上的重复行MYSQL学习 有人问过以下的问题:MYSQL学习 一个表上有两个字段b和c,分别关联到其他两个表的b和c字段.我想要找出在b字段或者c字段上具有重复值的行. 如上所述,查找在某一字段上具有重复值的行很简单,只要用group分组,然后计算组的大小. 提问者用到的样本数据: ?? a int not null primary key auto_increment,? ?? b int,? ?? c int? );? ? insert into a_b_c(b,c) values (1,1);? insert into a_b_c(b,2);? insert into a_b_c(b,3);? insert into a_b_c(b,c) values (2,c) values (3,3);? 现在,可以轻易看到表里面有一些重复的行,但找不到两行具有相同的二元组{b,c}.这便是为什么问题会变得困难了.MYSQL学习 2,错误的查询语句MYSQL学习 如果把两列放在一起分组,你会得到不同的结果,具体看如何分组和计算大小. 这是他用到的查询: group by b,c? having count(distinct b > 1)? ?? or count(distinct c > 1);? 结果返回所有的行,因为CONT(*)总是1.为什么?因为 >1 写在COUNT()里面. having count(1)? ?? or count(1);? 为什么?因为(b > 1)是一个布尔值,根本不是想要的结果.MYSQL学习 必要的是: having count(distinct b) > 1? ?? or count(distinct c) > 1;? 返回空结果.MYSQL学习 很显然,因为没有重复的{b,c}. +------+----------+? | b??? | count(*) |? +------+----------+? |??? 1 |??????? 3 |? |??? 2 |??????? 3 |? |??? 3 |??????? 3 |? +------+----------+? 没有一个能够找出全部的重复行. 《Mysql学习SQL查找删除重复的数据行》是否对您有启发,欢迎查看更多与《Mysql学习SQL查找删除重复的数据行》相关教程,学精学透。编程之家PHP学院为您提供精彩教程。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |