MySQL Delete Abfrage
Mika999
- php
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ß
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";
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