web-dev-qa-db-fra.com

Comment supprimer de sélectionner dans MySQL?

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).

74
IAdapter

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 .

182
BoltClock
DELETE 
  p1
  FROM posts AS p1 
CROSS JOIN (
  SELECT ID FROM posts GROUP BY id HAVING COUNT(id) > 1
) AS p2
USING (id)
20
Mchl

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  
3
Elegant Odoo

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;
0
havvg