我看过另一个类似主题的问题,但它并没有解决我目前遇到的问题。
我有两张桌子:
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)。那么让我们反向问题:如何从该组中选择除第一个/最后一个之外的所有内容?或者只有第一个/最后一个?
答案 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 IN
和GROUP 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?