如何在MySQL中重复删除记录?

时间:2015-09-14 14:55:27

标签: mysql

这很难。第三方一直向我们发送第四方的数据。但他们以一种可怕的形式做到了这一点,他们搞砸了并复制了许多数据。

现在数据全部在一个表中,即使它应该多于一个。这与历史数据格式有关。

现在应该在其他表中包含多个相关记录的每条记录,实际上如下所示放入我们的数据库:

Id HistoricalId Field1 Field2 Field3 Field4 FieldX ... 1 327 2 data data data 3 data data data 4 data data 5 data data 6 328 7 data data data (etc etc)

一切都大大简化了。所以你总是先得到一种“标题记录”。然后记录数据。直到有一个新的标题。让我们将所有记录从一个标题一起调用到另一个标题“superrecord”(例如在示例ID 1 t / m 5中形成第一个超级记录,下一个超级记录统计数据在Id 6)。

问题是:有很多重复的“超级记录”,很容易通过标题记录中的重复HistoricalId来识别。但它们可以在数据库中的任何位置(形成超级记录的记录将被很好地排序而不会混淆,但超级记录会混淆)。

所以谜题:删除所有重复的超级记录。如果不是更多,我们在这里谈论10.000s。

那么,你在MySQL中怎么样:

  1. 从重复的超级记录中找到ID(简单)
  2. 从下一个标题记录中找到ID(即以下超级记录)
  3. 删除第一个ID和第二个ID减去1
  4. 之间的所有内容(包括)
  5. 并为所有重复的超级记录执行此操作。
  6. 我的头开始旋转。只有mySQL才有可能,但是怎么样?我只是没有足够的经验。虽然我对MySQL不坏,但在这里我甚至看不到从哪里开始。或者我应该在PHP中编程?

    有人喜欢挑战吗?提前谢谢!

    更新:由于你和两个小时的辛勤工作解决了它。见解决方案。

2 个答案:

答案 0 :(得分:1)

如果您愿意复制到其他桌子等,那么......

  1. 您可以计算要删除的记录。历史ID存在于具有更高ID的其他记录中的所有记录

    SELECT id,HISTORICAL_ID    从tbl t1    WHERE historical_id> 0      并存在    (SELECT 1 FROM tbl t2    WHERE T2.hISTORICAL_id = T1.HISTORICAL_ID和T2.ID> T1.ID)

  2. 由于每条记录都有一个ID,因此对于每条记录,您可以计算标题记录的ID。 (这是你在评论中提到的)。这将是马克斯。填写历史ID的任何“上一个”记录中的ID。

    选择ID,HISTORICAL_ID   ,(选择MAX(ID)FROM T2,其中T1.ID< T2.ID和T1.HistoricalId<> 0)作为PARENT_ID 来自TBL T1

  3. 然后,您可以将PARENT_ID与第一个查询匹配,以获取您要删除的所有ID

答案 1 :(得分:0)

我终于解决了它。谢谢大家,你们都把我带到了正确的方向。

需要三个查询:

首先通过将HistoricalID设置为-1

来标记所有重复的标头记录
UPDATE 
   t1 INNER JOIN 
     (SELECT MIN(id) AS keep, HistoricalID FROM t1 
      GROUP BY HistoricalID 
      HAVING count(*) > 1 AND HistoricalID > 0) t2 
   ON t1.HistoricalID = t2.HistoricalID 
SET HistoricalID = IF(t1.id=t2.keep, t1.HistoricalID , -1) 
WHERE t1.HistoricalID > 0

其次将HistoricalID从标题记录复制到它下面的所有其他记录(在同一个超级记录中)。如果需要,我可以在以后轻松撤消。

UPDATE 
  t1 JOIN 
    ( SELECT Id, @s:=IF(HistoricalID='', @s, HistoricalID) HistoricalID FROM 
       (SELECT * FROM t1 ORDER BY Id) r, (SELECT @s:='') t ) t2 
  ON t1.Id = t2.Id 
SET t1.HistoricalID= t2.HistoricalID

删除所有重复项:

DELETE FROM t1 WHERE HistoricalID = -1

有效。没有你就不可能做到!