我有一个查询,在我的SQL数据库中找到重复项 - 现在如何删除所述重复项?

时间:2016-05-07 17:26:10

标签: mysql sql

我有一个SQL查询,它使用非常复杂的条件查找并分组这些重复项:

SELECT right(post_url, LOCATE('-', REVERSE(post_url),LOCATE('-',REVERSE(post_url))+1) -1) as name,
left(post_name,LOCATE('-',post_url,LOCATE('-',post_url)+1) - 1) as city,
post_title as original,ID,post_name,count(*) 
FROM table WHERE post_type='finder' 
GROUP BY name,city having count(*) > 1

为了解释这个问题,post_url基本上是一个网址名称,以某人的名字结尾,例如:new-jersey-something-something-donald -t

我从右边开始第二个破折号,然后得到这个名字。然后我得到左边第二个破折号的城市/州。通过这种方式,我已成功找到此数据库中的重复项 - 但我无法想出一种隔离副本并删除它的方法。另外,我只想在post_url中删除具有%near%的副本。我的问题是,使用此处的查询,如何更改此选项以删除副本?

1 个答案:

答案 0 :(得分:0)

您无法在一个查询中执行此操作。那是因为你需要写一个看起来像这样的查询:

DELETE FROM table
WHERE id IN (SELECT ... FROM table WHERE ...)

MySQL特别禁止这一点。您无法基于引用同一表的子查询进行删除。您也无法使用JOIN s重写此查询。

但是有一个简单的解决方案:使用临时表和两个查询。

-- build the list of IDs to delete
CREATE TEMPORARY TABLE temp
SELECT ... FROM table WHERE ...

-- now delete those items
DELETE FROM table
WHERE id IN (SELECT id FROM temp);

您可以使用JOIN和索引来提高效果。

“隔离”重复项的关键是确保您要删除的每个项目都有一个主键 - 这样您就可以轻松构建要删除的ID列表。如果您的表没有主键,那么您可以在多列上执行WHERE子句和JOIN - 这会很快变得混乱。