如何通过时差删除MySQL数据库中的重复项

时间:2013-04-11 08:06:38

标签: mysql sql

我看过另一个类似主题的问题,但它并没有解决我目前遇到的问题。

我有两张桌子:

users (id, name)

projects (id, user_id, image, inserted)

由于表格'项目中的Flash应用程序出错?有很多重复(一个项目被添加了几次)。在连续副本之间存在几秒钟的时差(小于10秒),这是确定重复项的唯一方法(用户可以添加无限数量的项目,但创建一个项目需要至少一分钟)。

如何选择和删除副本(并保留原始副本)?

修改

Robin Castlin在下面发布的解决方案几乎就在那里,但是这个查询:

SELECT p2.id
FROM project AS p
INNER JOIN project AS p2
ON p.id != p2.id AND p.user_id = p2.user_id AND 
    ABS(TIME_TO_SEC(TIMEDIFF(p.inserted, p2.inserted))) <= 10
GROUP BY p2.id

选择所有副本(如果用户添加项目5次,它会给我5个ID)。那么让我们反向问题:如何从该组中选择除第一个/最后一个之外的所有内容?或者只有第一个/最后一个?

2 个答案:

答案 0 :(得分:3)

CREATE TEMPORARY TABLE tmp_project (
    p1_id INT,
    p2_id INT
)
SELECT p.id, p2.id
FROM project AS p
INNER JOIN project AS p2
ON p.user_id = p2.user_id AND 
    ABS(TO_SECONDS(TIME_DIFF(p.inserted, p2.inserted))) <= 10;

SELECT p2_id
FROM tmp_project
WHERE p2_id NOT IN (SELECT p2_id
                    FROM tmp_project
                    GROUP BY p1_id)
GROUP BY p2_id;

我现在变得有点复杂了。由于我们需要使用相同的行2次来过滤第一次出现,我创建一个临时表并从那里处理它。我加入所有案例,即使是相同的ID,然后使用NOT INGROUP BY p1_id对其进行过滤。

如果图像数据的副本相同,也可以使用此解决方案:

在这些情况下,image字段不应该相同吗?

SELECT id
FROM project
WHERE id NOT IN (   SELECT id
                    FROM projects
                    GROUP BY image, user_id)

这将使您获得表中不是第一个重复项的列表。


然后拿走这些ID并简单地

DELETE FROM project WHERE id IN (id1, id2, id3, ...)

答案 1 :(得分:0)

在两个重要时刻之间取得差异。

如果差异为10秒[根据您的帖子],则不要添加它。

这个问题可以帮助您缩短时间间隔。

How to Split Time and calculate time difference in sql server 2005?