mysql - repetidas - select campos repetidos




Excluir todas as linhas duplicadas, exceto uma no MySQL? (2)

Duplicata Possível:
Remover linhas duplicadas no MySQL

Como eu excluiria todos os dados duplicados de uma tabela MySQL?

Por exemplo, com os seguintes dados:

SELECT * FROM names;

+----+--------+
| id | name   |
+----+--------+
| 1  | google |
| 2  | yahoo  |
| 3  | msn    |
| 4  | google |
| 5  | google |
| 6  | yahoo  |
+----+--------+

Eu usaria SELECT DISTINCT name FROM names; se fosse uma consulta SELECT .

Como eu faria isso com DELETE para remover apenas duplicatas e manter apenas um registro de cada um?


Aviso do editor: esta solução é computacionalmente ineficiente e pode reduzir sua conexão para uma tabela grande.

NB - Você precisa fazer isso primeiro em uma cópia de teste da sua mesa!

Quando fiz isso, descobri que, a menos que eu também incluísse AND n1.id <> n2.id , ele excluísse todas as linhas da tabela.

  1. Se você quiser manter a linha com o menor valor de id :

    DELETE n1 FROM names n1, names n2 WHERE n1.id > n2.id AND n1.name = n2.name
  2. Se você quiser manter a linha com o maior valor de id :

    DELETE n1 FROM names n1, names n2 WHERE n1.id < n2.id AND n1.name = n2.name

Eu usei esse método no MySQL 5.1

Não tenho certeza sobre outras versões.

Atualização: como as pessoas pesquisando para remover duplicatas acabam aqui
Embora a pergunta do OP seja sobre o DELETE , esteja ciente de que o uso de INSERT e DISTINCT é muito mais rápido. Para um banco de dados com 8 milhões de linhas, a consulta abaixo levou 13 minutos e, ao usar o DELETE , levou mais de duas horas e ainda não foi concluída.

INSERT INTO tempTableName(cellId,attributeId,entityRowId,value)
    SELECT DISTINCT cellId,attributeId,entityRowId,value
    FROM tableName;

Se você quiser manter a linha com o menor valor de id :

DELETE FROM NAMES
 WHERE id NOT IN (SELECT * 
                    FROM (SELECT MIN(n.id)
                            FROM NAMES n
                        GROUP BY n.name) x)

Se você quiser o valor de id que é o mais alto:

DELETE FROM NAMES
 WHERE id NOT IN (SELECT * 
                    FROM (SELECT MAX(n.id)
                            FROM NAMES n
                        GROUP BY n.name) x)

A subconsulta em uma subconsulta é necessária para o MySQL, ou você receberá um erro 1093.





duplicates