web-dev-qa-db-fra.com

Supprimer les lignes en double de la base de données wordpress où une colonne est dupliquée dans phpmyadmin

J'ai une table wordpress comme ça (phpmyadmin et MySQL)

| id |  meta_key | meta_value |
+----+-----------+------------+
| 1  | import_id | abc        |
| 2  | import_id | abc        |
| 3  | import_id | def        |
| 4  | import_id | xyz        |
| 5  | import_id | xyz        |
| 6  | import_id | xyz        |
| 7  | something | 123        |
| 8  | something | 234        |
+----+-----------+------------+

J'ai besoin d'obtenir l'id de toutes les lignes en double où meta_key = 'import_id'

afin de les retirer d'une autre table.

Je veux conserver le MIN (id) de chacune des lignes renvoyées où 'meta_value' est identique

c'est-à-dire que la sortie devrait être:

| id |  meta_key | meta_value |
+----+-----------+------------+
| 2  | import_id | abc        |
| 3  | import_id | def        |
| 6  | import_id | xyz        |
+----+-----------+------------+

ou juste

| id |
+----+
| 2  | 
| 3  | 
| 6  | 
+----+

s'il vous plaît aider comme alors que cela peut être une question en double, j'ai toujours du mal car mon SQL est un peu rouillé.

Je peux obtenir des doublons où meta_key = 'import_id' ressemble à ceci:

SELECT id,meta_value
FROM TABLE 
WHERE meta_key='import_id'
GROUP BY meta_value
HAVING Count(meta_value) > 1

et je veux à partir de cela les valeurs NON MIN (id)

2
Sortitout

si vous souhaitez conserver la ligne avec la valeur id la plus basse:

DELETE n1 FROM table n1, table n2 WHERE n1.id > n2.id AND n1.meta_key = n2.meta_key

OU si vous souhaitez conserver la ligne avec la valeur id la plus élevée:

DELETE n1 FROM table n1, table n2 WHERE n1.id < n2.id AND n1.meta_key= n2.meta_key
2
Cameron L

Donnez une sauvegarde de votre table wp_usermeta et essayez-la:

DELETE FROM `wp_usermeta` WHERE `umeta_id` NOT IN (SELECT * FROM (SELECT MAX(`um`.`umeta_id`) FROM `wp_usermeta` um GROUP BY `um`.`meta_key`, `um`.`meta_value`) x)

Utilisez MIN au lieu de MAX pour conserver la ligne avec l'id le plus bas.

1
MahdiY