Zeilen mit MySQL LEFT JOIN löschen


185

Ich habe zwei Tabellen, eine für Jobfristen, eine für die Beschreibung eines Jobs. Jeder Job kann einen Status annehmen, und einige Status bedeuten, dass die Fristen der Jobs aus der anderen Tabelle gelöscht werden müssen.

Ich kann leicht SELECTdie Jobs / Fristen, die meine Kriterien erfüllen, mit einem LEFT JOIN:

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'

( statusgehört nicht zur jobTabelle deadline)

Wenn ich diese Zeilen löschen möchte deadline, gibt MySQL einen Fehler aus. Meine Anfrage lautet:

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. Überprüfen Sie das Handbuch, das Ihrer MySQL-Serverversion entspricht, auf die richtige Syntax für die Verwendung in der Nähe von 'LEFT JOIN jobON Deadline.job_id = job.job_id WHERE status=' szaml 'in Zeile 1

Wie kann ich meine SELECTin eine funktionierende DELETEAbfrage verwandeln ?

Antworten:


334

Sie müssen lediglich angeben, auf welche Tabellen die angewendet werden soll DELETE.

Löschen Sie nur die deadlineZeilen:

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

Löschen Sie die Zeilen deadlineund job:

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

Löschen Sie nur die jobZeilen:

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

4
Mit "AS" musste ich den Alias ​​in meiner Klausel verwenden, damit er für meinen Zweck funktioniert (Waisen löschen): LÖSCHEN t1 AUS Tabelle1 AS t1 LINKS VERBINDEN t2 AS t2 ON t1.uid = t2.result WHERE t2.result IS NULL
Urs

Interessanterweise akzeptierte mein PHPMyAdmin 4.5.1-Syntaxprüfer nichts zwischen DELETEund FROM, aber die Abfrage lief trotzdem in Ordnung , wenn ich auf Los drückte.
ClayRay

38

Wenn Sie "Tabelle als" verwenden, geben Sie diese zum Löschen an.

Im Beispiel lösche ich alle table_1 Zeilen, die in table_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

4
DELETE FROM deadline where ID IN (
    SELECT d.ID FROM `deadline` d 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');

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


1
OP muss noch angeben, was DELETEdie Abfrage eindeutig machen soll. Die Verwendung Inmit Unterabfragen macht alles viel langsamer. Es wird am besten vermieden.
Ian Atkin

Keine Tabelle zwischen DELETEund erwähnt FROM.
Istiaque Ahmed

1

Versuche dies:

DELETE `deadline`
FROM `deadline`
INNER JOIN `job` ON `deadline`.`job_id` = `job`.`id`
WHERE `job`.`id` = 123

1

Mit MySQL können Sie die INNER JOIN-Klausel in der DELETE-Anweisung verwenden, um Zeilen aus einer Tabelle und die übereinstimmenden Zeilen in einer anderen Tabelle zu löschen.

Verwenden Sie beispielsweise die folgende Anweisung, um Zeilen aus T1- und T2-Tabellen zu löschen, die eine bestimmte Bedingung erfüllen:

DELETE T1, T2
FROM T1
INNER JOIN T2 ON T1.key = T2.key
WHERE condition;

Beachten Sie, dass Sie die Tabellennamen T1 und T2 zwischen die Schlüsselwörter DELETE und FROM setzen. Wenn Sie die T1-Tabelle weglassen, löscht die DELETE-Anweisung nur Zeilen in der T2-Tabelle. Wenn Sie die Tabelle T2 weglassen, löscht die Anweisung DELETE nur Zeilen in der Tabelle T1.

Ich hoffe das hilft.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.