2017-06-13 7 views
1

Ich habe über 30k Produkte, die ich von einer API in WooCommerce importiert habe. Es gab einen Fehler mit der API, der für die meisten Artikel doppelte Produkte hinzufügte, aber jetzt sind mir 30k + Produkte statt 15k Produkte übrig.WordPress WooCommerce Artikel mit Duplikat SKUs löschen

Es gibt keine Möglichkeit, dass ich jedes Duplikat manuell durchgehen und löschen kann. Ich habe versucht, ein SQL-Skript zu entwickeln, das dies ermöglicht, aber aufgrund der verschiedenen in WordPress gespeicherten Daten ist es komplex.

Es scheint, als ob dieses Skript alle eindeutigen Zeilen, aber nicht die Duplikate erhält.

SELECT meta_value, meta_key, count(*) 
FROM wp_postmeta WHERE meta_key LIKE '_sku' 
GROUP BY `meta_value` 

Also, was ich zu tun, bin auf der Suche nach ist alle Zeilen mit der Spalte meta_key = _sku mit doppelten Zeilen des Wertes in der Spalte mit der Bezeichnung meta_value

So zum Beispiel zu finden, wenn ich einige Zeilen wie folgt aus:

meta_id  post_id meta_key meta_value 
1504098  57049  _sku  26785030612 
1504135  57051  _sku  26785030612 
1503993  57045  _sku  26785033309 

ich mag es so aussehen:

meta_id  post_id meta_key meta_value 
1504135  57051  _sku  26785030612 
1503993  57045  _sku  26785033309 

Also muss ich die erste Zeile nur basierend auf dem Wert in Metawert löschen.

+0

Ist die 'post_id' eindeutig für die gesamte Tabelle? –

+0

Nein, Meta_ID ist jedoch. –

Antwort

1

Wenn meta_id einzigartig ist, dann können Sie die folgende Abfrage SELECT alle (Minimum) meta_id Werte für doppelte meta_value verwenden, zB:

SELECT MIN(meta_id) 
FROM wp_postmeta 
GROUP BY meta_value 
HAVING COUNT(*) > 1; 

Anschließend können Sie diese Abfrage in DELETE wickeln die Zeilen zu löschen, zB:

DELETE FROM wp_postmeta 
WHERE meta_id IN (

SELECT a.meta_id FROM (
     SELECT MIN(meta_id) AS `meta_id` 
     FROM wp_postmeta 
     GROUP BY meta_value 
     HAVING COUNT(*) > 1 
     ) a 
); 
+0

habe ich den Fehler: Sie können keine Zieltabelle ‚wp_postmeta‘ for update in FROM-Klausel –

+0

auch angeben, ich leicht modifiziert die Abfrage genau abzurufen, was ich wollte: DELETE FROM wp_postmeta WHERE meta_id IN ( SELECT MIN (meta_id) FROM wp_postmeta WHERE meta_key LIKE '_sku' GROUP BY meta_value HAVING COUNT (*)> 1 ); ' –

+0

@DylanCross Ich habe die Antwort aktualisiert, versuchen Sie es jetzt? –

Verwandte Themen