2016-07-19 28 views
0

Dies kann als ein Duplikat gekennzeichnet werden, aber ich konnte dieses Beispiel in meiner Suche nicht finden.MYSQL DELETE Zeile, wenn doppelte Schlüssel in der gleichen Tabelle mit dem angegebenen Wert existiert

Ich habe eine Product-to-Category-Tabelle, die doppelte Schlüssel erlaubt, so dass Produkte in mehreren Kategorien nach ID platziert werden können. Ich habe eine Situation, wo mehrere tausend Produkte falsch in einer Kategorie platziert wurden. Wenn das Produkt "Actionfiguren" und "Comics" zugewiesen ist, ist die Zuordnung "Comics" fehlerhaft.

Ich versuche, eine einzelne MySQL-Abfrage zu schreiben, die Zeilen löschen wird, wenn eine Zeile mit einem doppelten Schlüssel und dem angegebenen Wert für 'Action-Figuren' erkannt wird. Eine andere Möglichkeit, es zu sagen: Wenn ein Produkt beiden Kategorien zugewiesen ist, möchte ich die Zeile löschen, die es der fehlerhaften Kategorie zuweist.

Ich kann nicht scheinen, eine Löschanweisung zu finden, die in der gleichen Tabelle nach ID so suchen kann, wie ich will.

Hier ist, was ich bisher habe (Bearbeiten- Dank der Antwort unten):

DELETE FROM oc_product_to_category c1 
WHERE c1.category_id = '25' 
AND EXISTS(
SELECT * FROM oc_product_to_category c2 
WHERE c1.product_id = c2.product_id AND c2.category_id = '24') 

Leider ist dies ein Syntaxfehler Producting.

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 
'c1 
WHERE c1.category_id = '25' 
AND EXISTS (
SELECT * FROM oc_product_to_catego' at line 1 

Wenn ich versuche, die Syntax

DELETE c1 FROM oc_product_to_category c1 ... 

Ich erhalte eine Fehlermeldung:

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

Antwort

0

Dies sollte Sie loslegen. Wenn eine ID sowohl zugeordnet ist category_id 25 und 33, wird die Eintragung (en) mit der Kategorie 25.

DELETE c1 FROM oc_product_to_category as c1 
WHERE c1.category_id = '25' 
AND EXISTS (
    SELECT id FROM (SELECT * FROM oc_product_to_category) as c2 
    WHERE c1.id = c2.id AND c2.category_id = '33' 
) 

löschen Hinweis, dass dies nicht doppelte Datensätze mit category_id 33 entfernen wird falls vorhanden.

+0

Ich war mir nicht bewusst, dass Sie 2 verschiedene Aliase verwenden können, um auf die gleiche Tabelle zu verweisen ... Unwissenheit schlägt wieder. Und ja, die Zahlen sind willkürlich, aber ich versuche, die Daten zu reparieren. Die tatsächlichen Werte sind 25 und 33, aber keine Sorgen. –

+0

Es ist ein sehr nützliches Werkzeug zum Vergleichen von Werten innerhalb einer Tabelle. Ich habe 26 bis 33 aktualisiert. Bitte markieren Sie die Antwort als akzeptiert, wenn Sie Ihre Frage gelöst haben. –

+0

Ich habe meine Frage bearbeitet, einen Syntaxfehler bekommen und nicht genug Erfahrung mit SQL, um sie zu entschlüsseln. Danke auch für die Bearbeitung Ihrer Antwort. Der letzte Satz meines ersten Kommentars war auf einen anderen Kommentar gerichtet, der seitdem gelöscht wurde. –