Hier ist das Skript zum Erstellen meiner Tabellen:
CREATE TABLE clients (
client_i INT(11),
PRIMARY KEY (client_id)
);
CREATE TABLE projects (
project_id INT(11) UNSIGNED,
client_id INT(11) UNSIGNED,
PRIMARY KEY (project_id)
);
CREATE TABLE posts (
post_id INT(11) UNSIGNED,
project_id INT(11) UNSIGNED,
PRIMARY KEY (post_id)
);
Wenn ich in meinem PHP-Code einen Kunden lösche, möchte ich alle Projektbeiträge löschen:
DELETE
FROM posts
INNER JOIN projects ON projects.project_id = posts.project_id
WHERE projects.client_id = :client_id;
Die Tabelle posts hat keinen Fremdschlüssel client_id
nur project_id
. Ich möchte die Stellen in den Projekten löschen, die den Pass client_id
.
Dies funktioniert im Moment nicht, da keine Beiträge gelöscht werden.
13 Stimmen
Ich denke, Yehosef Antwort sollte die akzeptierte sein, da er Join verwendet, wie Sie gefragt und dass es besser als mit einer IN-Klausel, wie yukondude vorgeschlagen...
3 Stimmen
Das bevorzugte Muster ist ein
DELETE posts FROM posts JOIN projects ...
und nicht eineIN (subquery)
Muster. (Die Antwort von Yehosef gibt ein Beispiel für das bevorzugte Muster).1 Stimmen
@GerardoGrignoli, führt es besser für eine bestimmte Engine oder Version von MySQL? Es gibt keinen Grund, warum die beiden Abfragen unterschiedlich funktionieren sollten, da sie AFAIK identisch sind. Natürlich, wenn ich einen Nickel für jedes Mal hätte, wenn mein Abfrageoptimierer etwas Dummes macht....
0 Stimmen
Sie können auch Folgendes verwenden
alias
für den Tabellennamen und verwenden Sie diesen.0 Stimmen
Nur Dummköpfe glauben, sie könnten die Leistung anhand einer Abfrage vorhersagen. Eine Abfrage, die 10x schwieriger auszusehen scheint, kann viel schneller sein. Es hängt viel von den Schlüsseln ab.