这很难。第三方一直向我们发送第四方的数据。但他们以一种可怕的形式做到了这一点,他们搞砸了并复制了许多数据。
现在数据全部在一个表中,即使它应该多于一个。这与历史数据格式有关。
现在应该在其他表中包含多个相关记录的每条记录,实际上如下所示放入我们的数据库:
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中怎么样:
我的头开始旋转。只有mySQL才有可能,但是怎么样?我只是没有足够的经验。虽然我对MySQL不坏,但在这里我甚至看不到从哪里开始。或者我应该在PHP中编程?
有人喜欢挑战吗?提前谢谢!
更新:由于你和两个小时的辛勤工作解决了它。见解决方案。
答案 0 :(得分: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)
由于每条记录都有一个ID,因此对于每条记录,您可以计算标题记录的ID。 (这是你在评论中提到的)。这将是马克斯。填写历史ID的任何“上一个”记录中的ID。
选择ID,HISTORICAL_ID ,(选择MAX(ID)FROM T2,其中T1.ID< T2.ID和T1.HistoricalId<> 0)作为PARENT_ID 来自TBL T1
然后,您可以将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
有效。没有你就不可能做到!