删除表中没有主键的重复项。几个条件

时间:2013-11-07 15:26:58

标签: mysql duplicates

我正在尝试从没有主键的表中删除重复项。表的结构如下所示:

|cID|changeDate|changeTime|operator|
|001|01.01.2005|12:00:00  |a       |
|001|01.01.2005|12:00:00  |null    |
|002|01.01.2005|12:00:00  |a       |
|002|01.02.2005|12:00:00  |a       |
|002|01.02.2005|12:45:00  |a       |
|003|01.01.2005|12:00:00  |a       |
|003|01.01.2005|12:00:00  |a       |
|003|01.02.2005|12:00:00  |a       |
|003|01.03.2005|12:00:00  |a       |
|003|01.03.2005|12:00:00  |null    |

我想要实现的是:检查重复的'cID',保留最新日期为'changeDate'的那个。如果两个记录具有相同的'changeDate',则保留具有最新'changeTime'的记录。如果仍存在重复项,则保留“运算符”中未为空的那个结果。

上表应如下所示:

|cID|changeDate|changeTime|operator|
|001|01.01.2005|12:00:00  |a       |
|002|01.02.2005|12:45:00  |a       |
|003|01.03.2005|12:00:00  |a       |

DB是mysql,引擎是innodb。我想在不创建新表的情况下实现这一目标。

我的sql技能有限,实际上几乎不存在。我一直在阅读和搜索一段时间,我没有到达那里......

我尝试了不同的方法(临时表,选择内连接)

任何帮助都会有很大帮助。

1 个答案:

答案 0 :(得分:1)

请参阅SQLfiddle demo

保留临时表中所需的所有行:

SELECT t.* 
FROM (
SELECT ( 
    CASE cid 
    WHEN @curCId 
    THEN @curRow := @curRow + 1 
    ELSE @curRow := 1 AND @curCId := cid END
  ) AS rank,
  p.*
FROM      mytable p,(SELECT @curRow := 0, @curCId := '') r
ORDER BY cid,changedate desc,changetime desc,operator desc
) t
where rank =1

然后从yourtable中删除行

要完成,请将临时表中的行插入到yourtable