2012-10-14 3 views
1

Je voudrais effectuer un nettoyage dans l'une de mes tables MySQL Drupal pour supprimer les valeurs en double stockées. Voici la structure:Comment supprimer des lignes similaires de ma table dans MySQL?

NID VID DELTA FIELD_VALUE 
100 100 0  foobar 
100 100 1  foobar 
101 101 0  barbar 
101 101 1  barbar 
102 102 0  foofoo 

Mon but est de supprimer des lignes avec de plus gros DELTA s si une ligne avec le même NID, VID, FIELD_VALUE existe avec de plus petits DELTA.

Ma première tentative a été la requête suivante:

delete from mytable a where a.delta=1 and 1=(select count(nid) from mytable b where b.nid=a.nid and b.vid=a.vid and b.delta=0 and b.field_value=a.field_value)

Malheureusement, le DB dit: (MySQL 5.1.65-CLL)

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'a where a.delta=1 and 1 = (select count from `field_value` b where' at line 1 

qui est pas très utile pour moi.

MISE À JOUR:

Une réponse supprimé m'a dit que MySQL ne supporte pas les alias dans les instructions de suppression, mais la suppression des alias n'a pas aidé. La sous-requête est ok, vérifiée séparément.

Répondre

1

Que diriez-vous celui-ci?

DELETE a 
FROM mytable a 
JOIN mytable b ON (a.nid = b.nid 
       AND a.vid = b.vid 
       AND a.field_value = b.field_value) 
WHERE a.delta > b.delta 

(ne pas oublier de sauvegarder vos données)

+0

Merci, j'ai beaucoup appris de cette belle solution – jabal

0

Reliez la table à elle-même sur trois colonnes (NID, VID, FIELD_VALUE) et sélectionnez la valeur MAX pour DELTA.

Cela fonctionnera tant que vous n'avez aucune autre colonne impliquée.

Here is a good example for this

+1

Ok, 'SELECT max (a.delta) DE matable un REJOIGNEZ matable b ON (a.nid = b.nid ET un .vid = b.vid ET a.field_value = b.field_value) 'rendements 7. Mais comment l'utiliser dans la suppression? – jabal

Questions connexes