Ce code ne fonctionne pas pour MySQL 5.0, comment le réécrire pour le faire fonctionner
DELETE FROM posts where id=(SELECT id FROM posts GROUP BY id HAVING ( COUNT(id) > 1 ))
Je souhaite supprimer les colonnes qui n'ont pas d'identifiant unique. J'ajouterai que la plupart du temps, c'est un seul identifiant (j'ai essayé la syntaxe et cela ne fonctionne pas aussi).
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)
la source
CROSS JOIN
effectue apparemment une jointure cartésienne, il semble donc que cela puisse faire un travail inutile ou fonctionner de manière sous-optimale? Quelqu'un pourrait-il expliquer?USING
clause. LeUSING
produit étant limité aux paires ayant la même valeur enid
colonne, il est donc en fait très limité.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
vous pouvez utiliser la jointure interne:
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
la source
Si vous souhaitez supprimer tous les doublons, mais un sur chaque ensemble de doublons, voici une solution:
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;
la source