精华内容
下载资源
问答
  • 先查询几条demo数据,名字相同,时间不同 select id,name,create_date fromsys_user 方法1:最简单,且字段全部相同,排除其他字段不同; 先对表按照时间desc排序,在查询该层使用group by 语句,它会按照分组...

    先查询表几条demo数据,名字相同,时间不同

    select id,name,create_date from sys_user 

    方法1:最简单,且字段全部相同,排除其他字段不同; 

    先对表按照时间desc排序,在查询该层使用group by 语句,它会按照分组将你排过序的数据的第一条取出来

    select id,name,create_date from ( select * from sys_user order by create_date  desc) a group by a.name 

    方法2:使用not exists,该方法通过相同名字的不同创建的时间进行比较

    select id,name,create_date from sys_user a

    where not exists (select * from sys_user b where a.name = b.name and a.create_date < create_date )  ;

    方法3:使用内关联的方式;

    select * from sys_user a
          inner join (
            -- 先查询出最后一条数据的时间
            select id,name, MAX(create_date) create_date from sys_user
     group by name
          ) b on a.name = b.name and a.create_date = b.create_date  

     

    展开全文
  • MYSQL 删除表中重复数据

    万次阅读 2018-08-23 15:30:43
    test表中name字段信息有重复,想进行过滤删除重复数据 删除重复数据之后的预期结果(不考虑id):   方法一: 用 create ......select......group by ...... 先创建临时tab,新tab的数据时从test表中分组...

    test表中的原始数据:

            

    test表中name字段信息有重复,想进行过滤删除重复数据

    删除重复数据之后的预期结果(不考虑id):

              

    方法一:

    用 create ......select......group by ......

    先创建临时表tab,新表tab中的数据时从test表中分组查询出来的

    create table  tab select name ,code from test group by name

    拷贝原test的表结构为新表test1。然后删除原表test。

    drop table test

    然后查看tab表:

           

    此时tab表中的信息已经删除了重复信息(只考虑name字段的重复性)

    但是你会发现tab表中没有id,我们需要加上id,所以就将tab表中的数据插入test1中。

    用 insert into ......select ......的方法

    执行:insert into test1 select null,name,code from tab;

    执行后查看test1表中的信息:

         

    达到去删除重复数据的效果。

    最后将表test1改名为test就可以了

    alter table test1 rename to test   

    备注:insert into test1 select null,name,code from tab;

             利用mysql主键自增的特性,所以后面的select语句给id赋值为null即可。

    方法二:

    删除重复数据,保留重复数据中最小id所在行的数据

    delete from  test

    where

    name in (select pname from (select name as pname from test group by name having count(name) > 1) a)

    and

    id not in (select pid from (select min(id) as pid from test group by name having count(name) > 1 ) b)

    注意where 后面的两个条件:

    前者是查询name字段有重复值 且count >1的name值,后者是name字段有重复且count>1数据的最小id

    执行上面语句后结果:

         

    达到去重的目的,只是id不是连续的。

    此方法有一误区,错误sql语句展示如下:

    delete from  test

    where

    name in  (select name as pname from test group by name having count(name) > 1) 

    and

    id not in (select min(id) as pid from test group by name having count(name) > 1 ) 

    以上sql语句看似正确,执行后报错。

    错误信息:[Err] 1093 - You can't specify target table 'test' for update in FROM clause

     

     

    展开全文
  • mysql 过滤重复数据 group by和distinct

    千次阅读 2020-03-24 16:02:27
    1.group by过滤重复数据 用法:对table表中两个字段都重复的过滤 SELECT column1, column2 FROM table GROUP BY column1, column2; group by过滤重复数据还可以做到很灵活,例如想对重复几次的数据过滤,比如...

    1.group by过滤重复数据

    用法:对table表中两个字段都重复的过滤

    SELECT column1, column2
    FROM table
    GROUP BY column1, column2;

    group by过滤重复数据还可以做到很灵活,例如想对重复几次的数据过滤,比如查询重复3次以上的记录

    select column1,column2,count(1) as count 
    from table
    group by column1,column2
    having count>3

    2.distinct过滤重复数据

    用法:对table表中两个字段都重复的过滤

    SELECT DISTINCT column1, column2
    FROM table;

    注意:

    1.distinct可以加括号,也可以不加;加括号写法上只能对一个字段加括号,不然会报错,如:DISTINCT(column1), column2,虽然只对一个字段加括号,但是仍然是

    对两个字段都重复的过滤,不会只对column1字段重复过滤;结果DISTINCT column1, column2无差别

    2.distinct必须放在要查询字段的开头,SELECT column1, DISTINCT(column2)报错

    3.性能上两者区别

    在一个有10w条记录的表中进行查询,

    distict耗时:  0.078ms

    group by 耗时:0.031ms

    给查询的列添加索引之后:

    distict耗时:     0.00072550ms

    group by 耗时:0.00071650ms

    所以不管怎样,group by都要比distinct要快,从性能上推荐使用group by

     

    展开全文
  • mysql查询表里的重复数据方法: 1 2 3 4 INSERT INTO hk_test(username, passwd) VALUES ('qmf1', 'qmf1'),('qmf2', 'qmf11')   delete from hk_test where ...

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

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


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

    先查看重复的原始数据:



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

    1
    2
    3
    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字段重复记录的具体指:

    1
    2
    3
    4
    5
    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并没有为子查询生成临时表。在数据量大的时候,耗时很长时间


    解决方法:



    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    于是使用先建立临时表 
    复制代码 代码如下:
     
    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两个字段都有重复的记录:

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




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

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


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    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



    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    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
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    常用的语句
     
    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里查询表里的重复数据记录:先查看重复的原始数据:场景一:列出username字段有重读的数据123selectusername,count(*)ascountfromhk_testgroupbyusernamehavingcount>1;SELECTusername,count(username)...
  • MySQL 查询过滤重复数据

    万次阅读 2017-10-13 17:01:50
    1.查询new 表中去除title字段的重复数据,显示id最大的那条数据 Select * From new Where id In (Select Max(id) From new Group By title) ; 2.查询表中重复数据 Select * From  Where 重复字段...
  • 数据库重复数据时,用到哪些sql语句? 这里有若干数据,并掺杂了重复数据 1. 查看过滤重复后的数据 思路, group by 分组可以对多个列进行分组, 分组后可以过滤掉重复的数据 sql语句: SELECT id,`name`,...
  • mysql查询表里的重复数据方法:

    千次阅读 2017-05-11 09:13:30
    INSERT INTO hk_test(username, passwd) VALUES ('qmf1', 'qmf1'),('qmf2', 'qmf11')   delete from hk_test where username='qmf1' ...MySQL里查询表里的重复数据记录: 先查看重复的原始数据: 场景一:列
  • 在进行mysql复制过程,会出现数据重复的现象,怎样利用mysql 过滤重复数据呢?本文将提供详细的解决方法,需要了解的朋友可以参考下
  • MySQL 过滤多个重复字段

    千次阅读 2018-11-08 09:09:58
    MySQL 执行查询时,...关键点在于 COUNT(DISTINCT vs.name) ,DISTINCT 是 MySQL 用于过滤重复字段的关键字,但其默认只能紧跟在 SELECT 之后 此处通过 COUNT() 函数将其包裹后在指定字段,即可实现过滤效果 注意...
  • 主要介绍了MySQL处理重复数据的方法,处理重复数据包括防止表中出现重复数据、统计重复数据过滤删除重复数据,感兴趣的小伙伴们可以参考一下
  • 如若表中的部分字段没有唯一约束性,就会查询出重复数据。为了查询出不重复的数据,MYSQL 提供了distinct 关键字实现数据去重。 例: TEST 数据库的数据TABLE,其结构和数据如下 select a.* from table a; ...
  • MySQL 大批量插入,如何过滤重复数据?.pdf
  • 主要为大家详细介绍了MySQL处理重复数据的实现代码,如何防止数据出现重复数据及如何删除数据表中重复数据,感兴趣的小伙伴们可以参考一下
  • MySQL 处理重复数据

    千次阅读 2017-07-10 10:50:04
    防止表中出现重复数据 你可以在MySQL数据表中设置指定的字段为 PRIMARY KEY(主键) 或者 UNIQUE(唯一) 索引来保证数据的唯一性。 让我们尝试一个实例:下表中无索引及主键,所以该允许出现多条重复...
  • MySQL中查询所有数据,其中重复数据中只保留最新的一条,其余的过滤今天遇到的问题,数据库的数据中的某个条码号可能存在着不同时间的多条数据,但是业务只想查询全部数据,并且单个条码号的最新的一条数据 ...
  • 1、dict 如下 2、统计字段‘中文’的每一行的数据重复次数 select count(*) as repeat_count,a.`中文` from `字典`a group by a.`中文` having repeat_count > 1; 重复两次 3、查询所有重复字段名称的数据 ...
  • mysql处理重复数据

    千次阅读 2017-08-28 09:45:15
    2.保证不插入重复数据:INSERT IGNORE INTO与INSERT INTO的区别就是INSERT IGNORE会忽略数据库已经存在的数据,如果数据库没有数据,就插入新的数据,如果有数据的话就跳过这条数据。 3.统计重复数据mysql> ...
  • 如上图mysql表中数据。如何筛选出datetime字段在4月份内跟datetime字段不包含4月份内,name字段和region字段相同的数据,即4月份某个数据name为"AA",region为"东莞",跟不是在4月份内的某个数据name为"AA...
  • mysql-去除重复数据并且添加

    千次阅读 2017-11-27 14:52:48
    2.添加B表中所有不重复数据到A 3.查询B,和 A 进行判断 数据是否正确 4.删除B改名A为B create table tmp like t_yuesao_poster; insert into tmp select id,openid,image,max(time) as time from...
  • MySQL删除重复数据只保留最新的一条

    千次阅读 2019-04-17 19:00:37
    按天删除表中重复数据只保留最新的一条(这里按照id越大,数据越新),注意,一天可能出现多条数据。重复数据以name为准,即name相同视为重复 案例结构和数据 CREATE TABLE `test` ( `id` int(11) ...
  • 对于常规的MySQL数据表中可能存在重复的数据,有些情况是允许重复数据的存在,有些情况是不允许的,这个时候我们就需要查找并删除这些重复数据,以下是具体的处理方法! 方法一:防止表中出现重复数据表中未...
  • id,MatchName,MatchTime,master,guest,现在是因为写入数据库的时候会出现重复数据,请问一下应该怎么过滤?sql语句怎么写?![图片说明](https://img-ask.csdn.net/upload/201603/07/1457326425_115865.png)
  • Mysql的select in会自动过滤重复数据

    千次阅读 2018-01-03 00:36:00
    in范围内的数据,如果有重复的,只会选择第一个数据。 所以如果不是直接使用SQL语句来查询,而是在代码来查询时,记得使用 distinct 关键字 如: select id, name from table1 where ref_id in ( select id from...
  • 如何避免MySQL出现重复数据

    千次阅读 2018-03-21 14:38:41
    对于常规的MySQL数据表中可能存在重复的数据,有些情况是允许重复数据的存在,有些情况是不允许的,这个时候我们就需要查找并删除这些重复数据,以下是具体的处理方法!方法一:防止表中出现重复数据表中未添加...
  • mysql 重复数据,求和过滤的处理

    千次阅读 2013-04-12 17:07:39
    问题三:查询数据中所有某字段重复的记录? id name address 1 a shanghai 2 a beijing 3 b hongkong 4 c hunan 5 d hubei 解决问题一: 1)、distinct select distinct name from tablename;--求...
  • mysql 查询重复与删除重复数据

    千次阅读 2018-12-26 09:59:07
    一、根据身份证查询重复数据 方法、select count(*) as repeat_count,sfzhm from gaj_gx_hjxx_copy1 group by ...二、过滤重复数据 方法1、select distinct name,age from test_01; 方法2、select name,age,g...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 69,369
精华内容 27,747
关键字:

mysql过滤表中重复数据

mysql 订阅