Facetious: SQL + DELETE Problem

Hallo!

Ich habe in meiner Datenbank 4 Tabellen (tbl1, tbl2, tbl3,tbl4).
Jede dieser Tabellen hat ein Feld namens id_gast.

So, wenn ich jetzt einen Gast löschen will, entferne ich aus tbl1, tbl2, tbl3 und tbl4 alle Eintäge in denen id_gast = $guestId vorkommt.

  
  
$sql = "DELETE tbl1.*, tbl2.*, tbl3.*, tbl4.* FROM tbl1, tbl2, tbl3, tbl4 WHERE tbl1.id_gast = $guestId AND tbl2.id = $guestId AND tbl3.id_gast = $guestId AND tbl4.id_gast = $guestId;";  

dieser befehl funktioniert, aber nur, wenn in allen Tabellen (tbl1, tbl2, tbl3, tbl4) Einträge mit id_gast = $guestId existiert, falls nicht, gibt mir mysql_query zwar TRUE zurück, aber es wird kein Eintrag gelöscht.

Ist es möglich überhaupt möglich diesen Befehl so anzuwenden, oder sollte ich 4 eigenständige befehle schreiben?

ich danke im voraus
mfg Facetious

  1. Hallo!

    Welche MySQL-Version verwendest Du? Das ist bei MySQL immer eine wichtige Frage. Komplexere Joins zum Beispiel werden erst in der Version 5.0.1 bzw. sogar 5.0.12 richtig verarbeitet, auch wenn es in Deinem Fall nach einem "einfachen" Mehrtabellen-Join aussieht, den sogar eine 3.23.x schon hinkriegt.

    $sql = "DELETE tbl1., tbl2., tbl3., tbl4. FROM tbl1, tbl2, tbl3, tbl4 WHERE tbl1.id_gast = $guestId AND tbl2.id = $guestId AND tbl3.id_gast = $guestId AND tbl4.id_gast = $guestId;";

      
    PHP-Code ist bei SQL-Fragen höchst irrelevant. Poste besser reinen SQL-Code.  
    Das Handbuch, Abschnitt [Delete-Syntax](http://dev.mysql.com/doc/refman/5.0/en/delete.html) hilft Dir weiter. Weiterhin lesenswerte Lektüre sind die Artikel  
      
    [Einführung Joins](http://aktuell.de.selfhtml.org/artikel/review/datenbanken/joins/)  
    [Fortgeschrittene Joins](http://aktuell.de.selfhtml.org/artikel/review/datenbanken/fortgeschrittene-joins/)  
      
    
    > dieser befehl funktioniert, aber nur, wenn in allen Tabellen (tbl1, tbl2, tbl3, tbl4) Einträge mit id\_gast = $guestId existiert, falls nicht, gibt mir mysql\_query zwar TRUE zurück, aber es wird kein Eintrag gelöscht.  
      
    Du suchst unter anderem den `LEFT JOIN`{:.language-sql}.  
      
    
    > Ist es möglich überhaupt möglich diesen Befehl so anzuwenden, oder sollte ich 4 eigenständige befehle schreiben?  
      
    Eine weitere Möglichkeit, die Dir die InnoDB-Engine zur Verfügung stellt - und bei nahezu allen anderen Datenbankmanagementsystemen (DBMS), die ich kenne - wäre die Verwendung von [Foreign-Key-Constraints](http://dev.mysql.com/doc/refman/5.0/en/innodb-foreign-key-constraints.html) mit Löschweitergabe: `ON DELETE CASCADE`{:.language-sql}.  
      
      
    Freundliche Grüße  
      
    Vinzenz