用户名:
密 码: 记住
您当前的位置:首页 > 网络编程 > mysql教程

mysql重复记录取最后一条记录方法

时间:2015-01-23  来源:西部数据  作者:西部数据

在应用中一个表中出现大量重复记录是常事,但有的时间我们希望过滤重复数据并取重复记录的一条记录,下面我来给大家介绍一个取重复记录其中一条的方法.

如下表,代码如下:

  1. CREATE TABLE `t1` ( 
  2. `userid` INT(11) DEFAULT NULL
  3. `atime` datetime DEFAULT NULL
  4. KEY `idx_userid` (`userid`) 
  5. ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

数据如下,代码如下:

  1. MySQL> SELECT * FROM t1; 
  2. +--------+---------------------+ 
  3. | userid | atime | 
  4. +--------+---------------------+ 
  5. | 1 | 2013-08-12 11:05:25 | 
  6. | 2 | 2013-08-12 11:05:29 | 
  7. | 3 | 2013-08-12 11:05:32 | 
  8. | 5 | 2013-08-12 11:05:34 | 
  9. | 1 | 2013-08-12 11:05:40 | 
  10. | 2 | 2013-08-12 11:05:43 | 
  11. | 3 | 2013-08-12 11:05:48 | 
  12. | 5 | 2013-08-12 11:06:03 | 
  13. +--------+---------------------+ 
  14. ROWS IN SET (0.00 sec) 

其中userid不唯一,要求取表中每个userid对应的时间离现在最近的一条记录,初看到一个这条件一般都会想到借用临时表及添加主建借助于join操作之类的.

给一个简方法,代码如下:

  1. MySQL> SELECT userid,substring_index(group_concat(atime ORDER BY atime DESC),",",1) AS atime FROM t1 GROUP BY userid; 
  2. +--------+---------------------+ 
  3. | userid | atime | 
  4. +--------+---------------------+ 
  5. | 1 | 2013-08-12 11:05:40 | 
  6. | 2 | 2013-08-12 11:05:43 | 
  7. | 3 | 2013-08-12 11:05:48 | 
  8. | 5 | 2013-08-12 11:06:03 |  --phpfensi.com 
  9. +--------+---------------------+ 
  10. ROWS IN SET (0.03 sec) 

查询及删除重复记录,删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录,代码如下:

  1. delete from people  
  2. where peopleId  in (select  peopleId  from people  group  by  peopleId   having  count(peopleId) > 1) 
  3. and rowid not in (select min(rowid) from  people  group by peopleId  having count(peopleId )>1) 

查找表中多余的重复记录(多个字段),代码如下:

  1. select * from vitae a 
  2. where (a.peopleId,a.seq) in  (select peopleId,seq from vitae group by peopleId,seq  having count(*) > 1) 

删除表中多余的重复记录(多个字段),只留有rowid最小的记录,代码如下:

  1. delete from vitae a 
  2. where (a.peopleId,a.seq) in  (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1) 
  3. and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1) 

查找表中多余的重复记录(多个字段),不包含rowid最小的记录,代码如下:

  1. select * from vitae a 
  2. where (a.peopleId,a.seq) in  (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1) 
  3. and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)
来顶一下
返回首页
返回首页
推荐资讯
WiFi太不安全:7岁女孩11分钟内入侵公共网络 WiFi太不安全:7岁女孩11分钟内入侵近期刚刚发布研究说WiFi网络能获得人们手机里多少私人信息,
不服跑个分?人工智能也出现“刷分”乱象 不服跑个分?人工智能也出现“刷分2014年,人工智能领域突然爆发,成为了科研和科技创业的热门
相关文章
    无相关信息
栏目更新
栏目热门