2013-10-02 3 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 yes У меня есть идентификатор с каждым именем пользователя, и это только 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 

Это один оставит только строку с максимальным идентификатором для строк, которые имеют повторяющиеся имена пользователей.

Вот SQLFiddle демо

0

Не уверен, что это для SQL-сервера, вы можете попробовать аналогичный код в 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 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)) 
Смежные вопросы