Este código no funciona para MySQL 5.0, cómo reescribirlo para que funcione
DELETE FROM posts where id=(SELECT id FROM posts GROUP BY id HAVING ( COUNT(id) > 1 ))
Quiero eliminar columnas que no tienen una identificación única. Agregaré que la mayoría de las veces es solo una identificación (probé la sintaxis in y no funciona tan bien).
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)
fuente
CROSS JOIN
aparentemente realiza una unión cartesiana, por lo que parece que esto podría hacer un trabajo innecesario o funcionar de manera subóptima. ¿Alguien podría explicarlo?USING
cláusula. ConUSING
el producto se limita a pares que tengan el mismo valor en laid
columna, por lo que de hecho es muy 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
puedes usar la unión 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
fuente
Si desea eliminar todos los duplicados, pero uno de cada conjunto de duplicados, esta es una solución:
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;
fuente