79 votes

Comment supprimer des éléments d'une sélection en MySQL ?

Ce code ne fonctionne pas pour MySQL 5.0, comment le réécrire pour le rendre fonctionnel

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. Je vais ajouter que la plupart du temps, c'est seulement un identifiant (j'ai essayé la syntaxe in et cela ne fonctionne pas non plus).

192voto

BoltClock Points 249668

SELECT les (sous-)requêtes renvoient des ensembles de résultats. Vous devez donc utiliser IN, pas = dans votre clause WHERE.

De plus, comme le montre cette réponse, vous ne pouvez pas modifier la même table à partir d'une sous-requête dans la même requête. Cependant, vous pouvez soit SELECT puis DELETE dans des requêtes séparées, soit imbriquer une autre sous-requête et donner un alias au résultat de la sous-requête interne (bien que cela paraisse un peu bricolé) :

DELETE FROM posts WHERE id IN (
    SELECT * FROM (
        SELECT id FROM posts GROUP BY id HAVING ( COUNT(id) > 1 )
    ) AS p
)

Ou utiliser des jointures comme suggéré par Mchl.

21voto

Mchl Points 32343
DELETE 
  p1
  DE posts AS p1 
CROSS JOIN (
  SELECT ID FROM posts GROUP BY id HAVING COUNT(id) > 1
) AS p2
USING (id)

14voto

Cherif Points 6554

Vous pouvez utiliser une 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

0voto

havvg Points 359

Si vous souhaitez supprimer tous les doublons, sauf un dans 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;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X