删除重复的数据

时间:2015-03-28 04:30:00

标签: mysql

如何删除下面absen表格中的重复数据?

  
      
  1. 字段表absen(日期,时间,id_user)
  2.   
  3. 字段表员工(姓名,部门,地址,id_user)
  4.   

我尝试了查询:

select absen.date,min(absen.time),max(absen.time),absen.id_user,employee.name
from absen,employee 
where absen.id_user = employee.id_user 
group by absen.tanggal having employee.id_user = '00600320' and absen.tanggal between '2015/01/01' and '2015/01/31' 
order by absen.tanggal asc 

我想删除此查询中未包含的所有数据,因为员工每天有多行。

示例:

2015/01/01 08:00:00 00600320
2015/01/01 08:00:08 00600320
2015/01/01 08:00:15 00600320
2015/01/01 17:10:00 00600320
2015/01/01 17:00:10 00600320
2015/01/01 17:00:12 00600320

我只想从表absen中取出min和max并删除min和max之间的所有内容。

注意:我想要删除表。

1 个答案:

答案 0 :(得分:1)

分两步完成:

1 。使用相关的minmax日期获取您的数据:

您可以使用CONCAT功能来连接日期和时间。

select  
        t.id_user,
        min(CONCAT(t.date,' ',t.time)) mindate,
        max(CONCAT(t.date,' ',t.time)) maxdate 
from absen t
join employee on t.id_user = employee.id_user 
group by t.id_user ; 

2 。删除与上述想要的结果集无关或属于的数据。

创建另一个table(或temporary table),将无重复数据(maxmins插入其中,然后从原始表中删除数据不是在新创建的表中使用row_subquery并最终删除新创建的表,我创建了另一个表,因为不能同时使用delete并在同一个表上选择:

create table tbl(id_user int,
                          mindate datetime,
                          maxdate datetime);
insert into tbl
select  
        t.id_user,
        min(CONCAT(t.date,' ',t.time)) mindate,
        max(CONCAT(t.date,' ',t.time)) maxdate 
from absen t
join employee on t.id_user = employee.id_user 
group by t.id_user ;

delete from absen
where 
row(id_user,
    CONCAT(date,' ',time)) not in
(select id_user,mindate from tbl
 union
 select id_user,maxdate from tbl);
drop table tbl;

以下是我所做的THE DEMO