2010-09-18 8 views
0

J'ai la même situation que this other question, mais je ne veux pas sélectionner les lignes, je veux mettre à jour ces lignes.mettre à jour les lignes avec des entrées en double

J'ai utilisé le solution Scott Saunders made:

select * from table where email in (
    select email from table group by email having count(*) > 1 
) 

Cela a fonctionné, mais je voulais changer/mettre à jour une valeur de ligne dans ces entrées, alors j'ai essayé:

UPDATE `members` SET `banned` = "1" WHERE `ip` IN (
    SELECT `ip` FROM `members` GROUP BY `ip` HAVING COUNT(*) > 1 
) 

mais je reçois cette erreur :

You can't specify target table 'members' for update in FROM clause

Répondre

6

Utilisez une sous-requête intermédiaire pour contourner l'erreur 1093:

UPDATE `members` 
    SET `banned` = '1' 
WHERE `ip` IN (SELECT x.ip 
        FROM (SELECT `ip` 
          FROM `members` 
         GROUP BY `ip` 
         HAVING COUNT(*) > 1) x) 

Sinon, utilisez un JOIN sur une table dérivée:

UPDATE MEMBERS 
    JOIN (SELECT `ip` 
      FROM `members` 
     GROUP BY `ip` 
     HAVING COUNT(*) > 1) x ON x.ip = MEMBERS.ip 
    SET banned = '1' 
+0

+1 de Nice! Rien de tel qu'une minuscule solution de contournement. Curieux si MySQL supporte quelque chose comme: 'UPDATE M SET ... FROM Membres M WHERE ... GROUP BY ... AYANT ....' (pas de MySQL ici ATM). Pensées? –

+0

@ p.campbell: Je pense que l'option JOIN serait plus propre. Dommage que le JOIN dans UPDATE & DELETE n'est pas supporté dans la plupart des autres bases de données. –

0

Cette erreur signifie que vous ne pouvez pas mettre à jour la table members sur la base Crite ria de la table members. Dans votre cas, vous essayez de mettre à jour la table members en fonction d'une sous-requête de la table members. Au cours du processus, vous modifiez cette table. Pensez-y comme un poulet avant le paradoxe des œufs.

Vous devrez créer une table de référence temporaire ou enregistrer/coller les plages d'adresses IP afin d'exécuter cette instruction de mise à jour.

Questions connexes