web-dev-qa-db-ja.com

Phpmyadminで列が重複しているワードプレスデータベースから重複行を削除する

私はそのようなワードプレスのテーブルを持っています(phpmyadminと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        |
+----+-----------+------------+

Meta_key = 'import_id'の場合、すべての重複行のIDを取得する必要があります。

別のテーブルからそれらを削除するために。

'meta_value'が同じ場合、返された各行のMIN(id)を保持したい

すなわち、出力は次のようになります。

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

あるいは単に

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

私のSQLは少し錆びているので、これは私がまだ問題を抱えている重複した質問かもしれない間、助けてください。

Meta_key = 'import_id'のように重複することがあります。

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

私はこれからNON MIN(id)の値を求めています

2
Sortitout

行を最小のid値で保持したい場合は、次のようにします。

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

あるいは、行を最大のid値で保持したい場合は、

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

wp_usermetaテーブルからバックアップを取ってみてください。

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)

行を最小のIDで保持するには、MINの代わりにMAXを使用します。

1
MahdiY