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 ?

fabrik
quelle

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` ....
Daniel Vassallo
quelle
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
Roman Losev
quelle
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.

Francisco Soto
quelle
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
Zon
quelle
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.

Tahir
quelle