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 veux supprimer les colonnes qui n'ont pas d'identifiant unique. J'ajouterai que la plupart du temps, c'est son seul identifiant (j'ai essayé la syntaxe in et cela ne fonctionne pas aussi bien).
SELECT
Les (sous) requêtes renvoient les résultats . Donc, vous devez utiliser IN
, pas =
dans votre WHERE
clause.
En outre, comme indiqué dans cette réponse , vous ne pouvez pas modifier la même table à partir d'une sous-requête de la même requête. Cependant, vous pouvez soit SELECT
puis DELETE
dans des requêtes distinctes, soit imbriquer une autre sous-requête et aliaser le résultat de la sous-requête interne (bien que cela ressemble plutôt à un hacky):
DELETE FROM posts WHERE id IN (
SELECT * FROM (
SELECT id FROM posts GROUP BY id HAVING ( COUNT(id) > 1 )
) AS p
)
Ou utilisez des jointures comme suggéré par Mchl .
DELETE
p1
FROM posts AS p1
CROSS JOIN (
SELECT ID FROM posts GROUP BY id HAVING COUNT(id) > 1
) AS p2
USING (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
Si vous souhaitez supprimer tous les doublons, mais un seul de chaque jeu 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;