INSERT INTO hk_test(username, passwd) VALUES

('qmf1', 'qmf1'),('qmf2', 'qmf11')

delete from hk_test where username='qmf1' and passwd='qmf1'

MySQL里查询表里的重复数据记录:

先查看重复的原始数据:

场景一:列出username字段有重读的数据

select username,count(*) as count from hk_test group by username having count>1;

SELECT username,count(username) as count FROM hk_test GROUP BY username HAVING count(username) >1 ORDER BY count DESC;

这种方法只是统计了该字段重复对应的具体的个数

场景二:列出username字段重复记录的具体指:

select * from hk_test where username in (select username from hk_test group by username having count(username) > 1)

SELECT username,passwd FROM hk_test WHERE username in ( SELECT username FROM hk_test GROUP BY username HAVING count(username)>1)

但是这条语句在mysql中效率太差,感觉mysql并没有为子查询生成临时表。在数据量大的时候,耗时很长时间

解决方法:

于是使用先建立临时表

复制代码 代码如下:

create table `tmptable` as (

SELECT `name`

FROM `table`

GROUP BY `name` HAVING count(`name`) >1

);

然后使用多表连接查询

复制代码 代码如下:

SELECT a.`id`, a.`name`

FROM `table` a, `tmptable` t

WHERE a.`name` = t.`name`;

结果这次结果很快就出来了。

用 distinct去重复

复制代码 代码如下:

SELECT distinct a.`id`, a.`name`

FROM `table` a, `tmptable` t

WHERE a.`name` = t.`name`;

场景三:查看两个字段都重复的记录:比如username和passwd两个字段都有重复的记录:

select * from hk_test a

where (a.username,a.passwd) in (select username,passwd from hk_test group by username,passwd having count(*) > 1)

场景四:查询表中多个字段同时重复的记录:

select username,passwd,count(*) from hk_test group by username,passwd having count(*) > 1

MySQL查询表内重复记录

查询及删除重复记录的方法

(一)

1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断

select *

from people

where peopleId in (select peopleId from people group by peopleId having count(peopleId)>1)

2、删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有一个记录

delete from people

where peopleId in (select peopleId

from people group by peopleId having count(peopleId)>1)

and min(id) not

in (select id from people group by peopleId having count(peopleId)>1)

3、查找表中多余的重复记录(多个字段)

select * from vitae a

where (a.peopleId,a.seq) in

(select peopleId,seq from vitae group by peopleId,seq having count(*)>1)

4、删除表中多余的重复记录(多个字段),只留有rowid最小的记录

delete from vitae a

where

(a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq

having count(*) > 1)

and rowid not in (select min(rowid) from vitae group

by peopleId,seq having count(*)>1)

5、查找表中多余的重复记录(多个字段),不包含rowid最小的记录

select * from vitae a

where

(a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq

having count(*) > 1)

and rowid not in (select min(rowid) from vitae group

by peopleId,seq having count(*)>1)

(二)

比方说

在A表中存在一个字段“name”,而且不同记录之间的“name”值有可能会相同,现在就是需要查询出在该表中的各记录之间,“name”值存在重复的项;

Select Name,Count(*) From A Group By Name Having Count(*) > 1

如果还查性别也相同大则如下:

Select Name,sex,Count(*) From A Group By Name,sex Having Count(*) > 1

(三)

方法一

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

SELECT * from tab1 where CompanyName in( SELECT companyname from tab1 GROUP BY CompanyName HAVING COUNT(*)>1);

-- 129.433ms

SELECT * from tab1 INNER join ( SELECT companyname from tab1 GROUP BY CompanyName HAVING COUNT(*)>1) as tab2 USING(CompanyName);

-- 0.482ms

方法二

有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。

1、对于第一种重复,比较容易解决,使用

select distinct * from tableName

就可以得到无重复记录的结果集。

如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除

select distinct * into #Tmp from tableName

drop table tableName

select * into tableName from #Tmp

drop table #Tmp

发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。

2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下

假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集

select identity(int,1,1) as autoID, * into #Tmp from tableName

select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID

select * from #Tmp where autoID in(select autoID from #tmp2)

最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)

(四)查询重复

select * from tablename where id in (

select id from tablename group by id having count(id) > 1)

常用的语句

1、查找表中多余的重复记录,重复记录是根据单个字段(mail_id)来判断

代码如下 复制代码

SELECT * FROM table WHERE mail_id IN (SELECT mail_id FROM table GROUP BY mail_id HAVING COUNT(mail_id) > 1);

2、删除表中多余的重复记录,重复记录是根据单个字段(mail_id)来判断,只留有rowid最小的记录

代码如下 复制代码

DELETE FROM table WHERE mail_id IN (SELECT mail_id FROM table GROUP BY mail_id HAVING COUNT(mail_id) > 1) AND rowid NOT IN (SELECT MIN(rowid) FROM table GROUP BY mail_id HAVING COUNT(mail_id )>1);

3、查找表中多余的重复记录(多个字段)

代码如下 复制代码

SELECT * FROM table WHERE (mail_id,phone) IN (SELECT mail_id,phone FROM table GROUP BY mail_id,phone HAVING COUNT(*) > 1);

4、删除表中多余的重复记录(多个字段),只留有rowid最小的记录

代码如下 复制代码

DELETE FROM table WHERE (mail_id,phone) IN (SELECT mail_id,phone FROM table GROUP BY mail_id,phone HAVING COU(www.111cn.net)NT(*) > 1) AND rowid NOT IN (SELECT MIN(rowid) FROM table GROUP BY mail_id,phone HAVING COUNT(*)>1);

5、查找表中多余的重复记录(多个字段),不包含rowid最小的记录

代码如下 复制代码

SELECT * FROM table WHERE (a.mail_id,a.phone) IN (SELECT mail_id,phone FROM table GROUP BY mail_id,phone HAVING COUNT(*) > 1) AND rowid NOT IN (SELECT MIN(rowid) FROM table GROUP BY mail_id,phone HAVING COUNT(*)>1);

存储过程

代码如下 复制代码

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

(一)单个字段

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 que(www.111cn.net)stions 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;

查找mysql数据表中重复记录

mysql数据库中的数据越来越多,当然排除不了重复的数据,在维护数据的时候突然想到要把多余的数据给删减掉,剩下有价值的数据。

以下sql语句可以实现查找出一个表中的所有重复的记录.

select user_name,count(*) as count from user_table

group by user_name having count>1;

参数说明:

user_name为要查找的重复字段.

count用来判断大于一的才是重复的.

user_table为要查找的表名.

group by用来分组

having用来过滤.

把参数换成自己数据表的相应字段参数,可以先在Phpmyadmin里面或者Navicat里面去运行,看看有哪些数据重复了,然后在数据库里面删除掉,也可以直接将SQL语句放到后台读取新闻的页面里面读取出来,完善成查询重复数据的列表,有重复的可以直接删除。

效果如下:

缺点:这种方法的缺点就是当你的数据库里面的数据量很大的时候,效率很低,我用的是Navicat测试的,数据量不大,效率很高,当然,网站还有其它查询数据重复的SQL语句,举一反三,大家好好研究研究,找到一个适合自己网站的查询语句。

mysql选出重复的字段_mysql查询表里的重复数据方法:相关推荐

  1. mysql查询表里面重复的数据_mysql查询表里的重复数据方法

    这篇文章主要介绍了mysql查询表里的重复数据方法,需要的朋友可以参考下 INSERT INTO hk_test(username, passwd) VALUES ('qmf1', 'qmf1'),( ...

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

    1 2 3 4 INSERT INTO hk_test(username, passwd) VALUES ('qmf1', 'qmf1'),('qmf2', 'qmf11')   delete fro ...

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

    1 2 3 4 INSERT INTO hk_test(username, passwd) VALUES ('qmf1', 'qmf1'),('qmf2', 'qmf11') delete from  ...

  4. Mysql 拼接多个字段作为查询条件查询方法

    最近工作中需要把多个字段拼接作为查询条件查询,特此记录便于日后查阅. <select id="listByProgramCodeList" resultType=" ...

  5. mysql重复度高的字段_mysql中大表中重复字段的高效率查询的方法

    mysql中大表重复字段应该如何查询到?这似乎是一个很折磨人的问题. 本文为大家介绍一个MySQL大表重复字段的查询方法,供大家学习参考. 数据库中有个大表,需要查找其中的名字有重复的记录id,以便比 ...

  6. mysql 查重名现象_mysql查询重复数据【转】

    表全部数据 ------------------- 1 查询people_no重复的记录 select * from people where people_no in (select people_ ...

  7. mysql code name作为字段_MySQL索引管理及执行计划

    一.索引介绍 1.什么是索引  1)索引就好比一本书的目录,它能让你更快的找到自己想要的内容. 2)让获取的数据更有目的性,从而提高数据库检索数据的性能. 2.索引类型介绍 1)BTREE:B+树索 ...

  8. mysql怎么查找列命令_MySQL查询命令-DQL

    MySQL查询命令-DQL EMP //员工表 员工编号 员工名 岗位 领导 入职日期 工资 奖金 部门编号 +-------+--------+-----------+------+-------- ...

  9. mysql 近几天内_MYSQL查询一周内的数据(最近7天的)

    select * from wap_content where week(created_at) = week(now) 如果你要严格要求是某一年的,那可以这样 查询一天: select * from ...

最新文章

  1. Practical Vim 第一章 第二章
  2. LinkedList 使用巩固及图解
  3. onsrcoll和scrollTop兼容与实现
  4. mybatis中getMapper是怎么通过动态代理得到dao接口的实现类并执行mapper文件sql语句的
  5. 安装安卓SDK和JDK的简便方法
  6. flink的CEP调研与使用
  7. 【WebRTC---入门篇】(二十)WebRTC核心之SDP详解
  8. 2020年最快的dns_2020年哪里换旅行证最快取证?需要几天?
  9. 三星android11推送,三星国行S10系列正式推送One UI 3正式版,基于安卓11打造
  10. 一张“神图”看懂单机/集群/热备/磁盘阵列(RAID)
  11. Spring Framework 5.0 新特性有这些
  12. JS学习总结(1)——基础知识
  13. C#封装DLL类库,调用类库
  14. EN300328测试软件,EN300328是做什么测试
  15. java socket 发对象_Java Socket 发送对象
  16. 使用JS将table表格导出为excel
  17. “500 - 内部服务器错误。”解决办法
  18. NSDate-日期类nbsp;OC——第七天(1)
  19. 湖南无线数字电服务器,戴尔服务器搭建湖南省高校数字化图书馆
  20. 由内建质量到持续集成

热门文章

  1. git 创建分支,更改并提交
  2. C#进行Visio二次开发之判断图纸是否有设备
  3. vue2.0 与 bootstrap datetimepicker的结合使用
  4. ul li设置横排,并除去li前的圆点
  5. QA发现的令人抓狂的BUG
  6. 高效排序算法(快排序)
  7. 架构与思维:系统容量设计
  8. 你的登录接口真的安全吗?快看看你有没有中招!
  9. 环形链表找入口,真的太妙了
  10. 记一次线上商城系统 Tomcat、JVM 高并发的优化