2013-10-02 41 views
1

我有以下查询基本上找到自己的用户名列中的所有副本:删除重复在一列

SELECT `username` 
FROM `instagram_user` 
GROUP BY `username` 
HAVING COUNT(*) >1 

如何删除所有的重复,这样只会让我用一个唯一的用户名中桌子?只要表中有一个唯一的用户名,我不关心哪个实体被持久或删除。

+1

您使用了什么引擎(MyISAM,InnoDB,...)?你有一些'id'专栏吗?更好,但张贴您的表架构 – peterm

+1

另请参阅http://stackoverflow.com/questions/3311903/remove-duplicate-rows-in-mysql?rq=1 – Thilo

+0

@peterm是的我有每个用户名的id,它只是ID和用户名..使用MyISAM – adit

回答

2

如果你不在乎什么纪录选择然后只是添加一个唯一的约束,而使用IGNORE

ALTER IGNORE TABLE instagram_user ADD UNIQUE (username); 

这里是SQLFiddle演示

和MySQL会为你做这项工作。无论如何,您都希望拥有唯一的约束条件,以便将来您的表格不会出现重复。

或者你也可以做

DELETE t 
    FROM instagram_user t JOIN 
(
    SELECT username, MAX(id) id 
    FROM instagram_user 
    GROUP BY username 
    HAVING COUNT(*) > 1 
) q 
    ON t.username = q.username 
    AND t.id <> q.id 

这一次将只留下与最大ID一排具有重复的用户名行。

这里是SQLFiddle演示

0

不确定这是否适用于SQL Server,您可以尝试在mysql中使用类似的代码。

;With CteUsers AS(

SELECT *,ROW_NUMBER() OVER (PARTITION BY username Order by username) AS ROWID 
FROM(

SELECT PkId, `username` 
FROM `instagram_user` 
)tbltemp) 
SELECT * FROM CteUsers; 

这将导致如下

PkId username RowId 
1  xx  1 
2  xx  2 
.... 

然后删除其中RowId的> 1

;随着CteUsers AS(

SELECT *,ROW_NUMBER() OVER (PARTITION BY username Order by username) AS ROWID 
    FROM(

    SELECT PkId, `username` 
    FROM `instagram_user` 
    )tbltemp) 
    DELETE instagram_user WHERE PkId iN (SELECT PkId FROM CteUsers WHERE ROWID > 1); 
0

这会给你的副本(即你需要删除的)...

select a.id, a.username from instagram_user a, instagram_user b 
where a.username = b.username and a.id <> b.id 
    and b.id = (select min(id) from instagram_user where username = a.username) 

所以DELETE会是这样的......

delete from instagram_user where id in 
(select a.id from instagram_user a, instagram_user b 
    where a.username = b.username and a.id <> b.id 
     and b.id = (select min(c.id) from instagram_user c 
        where c.username = a.username))