2010-05-04 25 views
143

Ich habe zwei Tabellen, eine für Job-Deadlines, eine für die Beschreibung eines Jobs. Jeder Job kann einen Status annehmen und einige Status bedeuten, dass die Jobtermine aus der anderen Tabelle gelöscht werden müssen.Löschen von Zeilen mit MySQL LEFT JOIN

Ich kann leicht SELECT die Arbeitsplätze/Fristen, die meine Kriterien mit einem LEFT JOIN erfüllt:

SELECT * FROM `deadline` 
LEFT JOIN `job` ON deadline.job_id = job.job_id 
WHERE `status` = 'szamlazva' 
OR `status` = 'szamlazhato' 
OR `status` = 'fizetve' 
OR `status` = 'szallitva' 
OR `status` = 'storno' 

(status gehört job Tabelle nicht deadline)

Aber wenn ich möchte diese Zeilen löschen von deadline, wirft MySQL einen Fehler. Meine Frage ist:

DELETE FROM `deadline` 
LEFT JOIN `job` 
ON deadline.job_id = job.job_id 
WHERE `status` = 'szamlazva' 
OR `status` = 'szamlazhato' 
OR `status` = 'fizetve' 
OR `status` = 'szallitva' 
OR `status` = 'storno' 

MySQL Fehler sagt nichts:

Sie haben einen Fehler in Ihrer SQL-Syntax; Sie in die Bedienungsanleitung zu Ihrer MySQL-Server-Version für die richtige Syntax entspricht in der Nähe zu verwenden ‚LEFT JOIN job ON deadline.job_id = job.job_id WHERE status = 'szaml' at line 1

Wie kann ich meine SELECT drehen in eine funktionierende DELETE Abfrage?

Antwort

260

Sie müssen nur angeben, auf welche Tabellen die DELETE anzuwenden ist.

Löschen nur die deadline Reihen:

DELETE `deadline` FROM `deadline` LEFT JOIN `job` .... 

Löschen der deadline und job Reihen:

DELETE `deadline`, `job` FROM `deadline` LEFT JOIN `job` .... 

Löschen nur die job Reihen:

DELETE `job` FROM `deadline` LEFT JOIN `job` .... 
+5

Verwenden Sie auch "Status in ('szamlazva', 'szamlazhato', 'fizetve', .........)" – Salil

+3

Mit "AS" musste ich den Alias ​​in meiner Klausel verwenden, damit er für meine Arbeit funktioniert Zweck (löschen Waisen): DELETE FROM t1 table1 AS t1 LEFT t2 als t2 JOIN ON t1.uid = t2.result WHERE t2.result IS NULL – Urs

+0

Referenz: http://dev.mysql.com/doc/ refman/5.7/de/delete.html – Slawa

1

Ich bin mir nicht sicher, ob diese Art von Unterabfrage in MySQL funktioniert, aber versuchen Sie es. Ich gehe davon aus, dass Sie in Ihrer Termintabelle eine ID-Spalte haben.

+1

OP muss noch angeben, was zu 'DELETE' gehört, um die Abfrage eindeutig zu machen. Die Verwendung von 'In' mit Unterabfragen macht alles viel langsamer. Es ist am besten zu vermeiden. –

+0

Keine Tabelle zwischen 'DELETE' und' FROM'. –

25

Wenn Sie mit „Tabelle als ", und dann zum Löschen angeben.

In dem Beispiel lösche ich alle Tabelle_1 Zeilen, die in Tabelle_2 nicht vorhanden sind.

DELETE t1 FROM `table_1` t1 LEFT JOIN `table_2` t2 ON t1.`id` = t2.`id` WHERE t2.`id` IS NULL 
+0

@Roman Losev - Was ist der Punkt von WHERE 1 – vmanta

+0

Es ist meine Standard-Select-Methode ... Sorry, dafür. Vergessen, zu löschen Bearbeiteter Beitrag. –