Mika999: MySQL Delete Abfrage

Hi,

ich habe 3 Tables, die wie folgt zusammen hängen:

Table session
Table session_pers
Table session_do

Alle 3 Tables haben die Spalte sessionid.

Nun möchte ich eine Abfrage, die alle Zeilen in Table session_pers sowie Table session_do löscht, deren sessionid in session NICHT mehr vorhanden ist.

Beispiel (Ich nehme 4stellige Ziffern als Sessionid):
session:
1938
3424
2455

session_pers
3424
9282
1000

session_do
1938
3424
1002

Nun sollte er 9282 sowie 1000 in session_pers löschen und
1002 in session_do. Geht das Ganze mit SQL ohne die Daten groß in PHP zu verwursteln?

Danke und Gruß

  1. echo $begrüßung;

    Nun möchte ich eine Abfrage, die alle Zeilen in Table session_pers sowie Table session_do löscht, deren sessionid in session NICHT mehr vorhanden ist.
    [...] Geht das Ganze mit SQL ohne die Daten groß in PHP zu verwursteln?

    Das sollte hinzubekommen sein. Inwieweit kennst du dich bereits mit der Verknüpfung von Tabellen aus? Siehe Einführung in Joins. Um Datensätze zu ermitteln, die in A aber nicht in B vorhanden sind, verknüpft man die Tabelle A mit einem LEFT JOIN mit Tabelle B und wählt als Bedingung (im WHERE) nur die Datensätze, die in Tabelle B NULL ergeben (z.B. WHERE B.id IS NULL). Das kannst du ja erstmal mit einem SELECT-Statement probieren, um zu testen, dass die richtigen Datensätze gewählt werden.
    Nun brauchst du von der DELETE-Syntax die Multiple-table Syntax und baust das oben ermittelte funktionierende SELECT zum DELETE um.

    echo "$verabschiedung $name";

  2. Hallo Mika,

    eine sehr schöne und exakte Beschreibung, dazu ein erläuterndes Beispiel - eine beispielhafte Problembeschreibung.

    Nun möchte ich eine Abfrage, die alle Zeilen in Table session_pers sowie Table session_do löscht, deren sessionid in session NICHT mehr vorhanden ist.

    Erster Fall: Zwei DELETE-Statements mit Subselect (mindestens MySQL 4.1.x)

      
    DELETE                    -- Lösche alle Datensätze  
    FROM session_pers         -- in der Tabelle session_pers  
    WHERE sessionid NOT IN (  -- die keine Entsprechung  
        SELECT  
            sessionid         -- in der Tabelle  
        FROM session )        -- session haben  
    
    

    Das zweite DELETE-Statement solltest Du nun selbst hinbekommen.

    MySQL 4.0.x unterstützt keine Subselects, dort solltest Du statt dessen einen LEFT JOIN verwenden.

    Seit MySQL 4.0.x wird die Multiple-Table-Syntax für DELETE unterstützt. Du könntest somit beides in einer Abfrage abhandeln.

    Wenn Du InnoDB-Tabellen hast, dann könntest Du das viel cleverer mit Foreign-Key-Constraints lösen, genauer gesagt mit ON DELETE CASCADE. Somit übernimmt die Datenbankmanagementengine für Dich diese Aufräumarbeiten. In MySQL gibt es das leider nur für InnoDB, ab MySQL 3.23.44.

    Wie Du meinen Ausführungen entnehmen kannst, ist es bei Fragen zu MySQL immer eine gute Idee, die genaue Version anzugeben - in Deinem Fall sogar die verwendete Tabellen-Engine.

    Freundliche Grüße

    Vinzenz