Este código não funciona para MySQL 5.0, como reescrevê-lo para que funcione
DELETE FROM posts where id=(SELECT id FROM posts GROUP BY id HAVING ( COUNT(id) > 1 ))
Eu quero excluir colunas que não têm id exclusivo. Vou acrescentar que na maioria das vezes é apenas um id (tentei a sintaxe in e não funciona bem).
SELECT id FROM posts GROUP BY id HAVING ( COUNT(id) > 1 )
DELETE p1 FROM posts AS p1 CROSS JOIN ( SELECT ID FROM posts GROUP BY id HAVING COUNT(id) > 1 ) AS p2 USING (id)
fonte
CROSS JOIN
aparentemente executa uma junção cartesiana, então parece que isso pode fazer um trabalho desnecessário ou ter um desempenho abaixo do ideal? Alguém poderia explicar?USING
cláusula. ComUSING
o produto é limitado a pares de mesmo valor naid
coluna, por isso é na verdade muito limitado.DELETE p1 FROM posts AS p1 INNER JOIN ( SELECT ID FROM posts GROUP BY id HAVING COUNT(id) > 1 ) AS p2 ON p2.ID=p1.ID
você pode usar junção interna:
DELETE ps FROM posts ps INNER JOIN (SELECT distinct id FROM posts GROUP BY id HAVING COUNT(id) > 1 ) dubids on dubids.id = ps.id
fonte
Se você deseja excluir todas as duplicatas, exceto uma de cada conjunto de duplicatas, esta é uma solução:
DELETE posts FROM posts LEFT JOIN ( SELECT id FROM posts GROUP BY id HAVING COUNT(id) = 1 UNION SELECT id FROM posts GROUP BY id HAVING COUNT(id) != 1 ) AS duplicate USING (id) WHERE duplicate.id IS NULL;
fonte