# MySQL - Delete mit Join



## Mik3e (6. Juni 2005)

Abend zusammen!

Stehe vor folgendem Problem:
Habe ein Konstrukt aus drei Tabellen (2 "Haupt"-Tabellen, die über eine assoziative Tabelle verknüpft sind). Soweit nichts besonderes.

Nun ist es aber so, dass ich Datensätze aus der assoziativen Tabelle entfernen muss, um die Verknüpfung zu lösen. Das geht allerdings nicht so einfach, da an diesen Löschvorgang eine Bedingung einer Haupttabelle geknüpft ist.

Nun wüßte ich gerne, ob es irgendwie die Möglichkeit einer JOIN Operation auf ein Delete Statement gibt. Würde mir das ganze im Prinzip so vorstellen (nur mit zwei Tabellen zur leichteren Verständlichkeit):


```
DELETE FROM 
`tbl_bezahlart_join_sysuser` AS t1 
LEFT JOIN `tbl_sysuser` AS t2 ON t1.`fk_sysuser_id`=t2.`pk_sysuser_id` 
WHERE t1.`fk_bezahlart_id`='0815' 
AND t2.`fk_veranstalter_id`='4711'
```
pk_**** = Primary Key
fk_**** = Foreign Key

*Im Anhang auch der Ausschnitt des ERDs zur leichteren Verständlichkeit.*

Bilde mir ein mal gehört zu haben, dass es JOINS ausschließlich bei SELECT gibt, interessanterweise beschwert sich der MySQL Server aber nicht über die Syntax. Er löscht nur einfach nichts.

Vielleicht gibt es auch die Möglichkeit einer IF-Clause bzw. ein ähnliches derivat dazu

Danke & LG
Mike


----------



## hpvw (6. Juni 2005)

Das sollte sich mit Subselects lösen lassen.
Nehmen wir mal an, Du hast eine Tabelle User (id, name) und eine Tabelle Rechte (id, beschreibung).
Dazu eine Assoziationstabelle userRechte (userID, rechteID).
Nun willst Du allen Usern, die mit B beginnen das Recht "Bearbeiten" entziehen.
Dann sollte (ab MySQL-Version 4.1 ungefähr) folgendes zum Erfolg führen:

```
DELETE FROM userRechte 
WHERE userID IN 
  (SELECT id FROM User 
    WHERE name LIKE 'B%') 
AND rechteID IN 
  (SELECT id FROM Rechte 
    WHERE beschreibung LIKE 'Bearbeiten')
```
Im Subselect sind dann natürlich auch JOINs möglich.
Gruß hpvw


----------



## Mik3e (6. Juni 2005)

Hi!

Danke für die Info.. Werde mal in der Subselect Doku blättern. Ich weiß nur, dass ich mich vor ca. einem Jahr mit SUBSELECT und UNION beschäftigt habe, aber das wurde alles noch nicht von MySQL unterstützt. Damals gab es SUBSELECT erst in einer Beta Version...

Die andere Variante wäre, das ganze in mehrere Statements zu teilen. Davon halte ich allerdings nicht viel, da das dann doch eine recht billige und Performance-lastige Sache wäre..

LG
Mike


----------



## hpvw (6. Juni 2005)

Mik3e hat gesagt.:
			
		

> Die andere Variante wäre, das ganze in mehrere Statements zu teilen. Davon halte ich allerdings nicht viel, da das dann doch eine recht billige und Performance-lastige Sache wäre..


Das ist meines Wissens die einzige Variante, Querys mit Subselects in ältere MySQL-Versionen zu portieren.


----------



## Mik3e (6. Juni 2005)

Ich hab es schon befürchtet )
Wühle mich jetzt mal durch die SUBSELECT Doku...

Danke jedenfalls,
Mike


----------



## Mik3e (6. Juni 2005)

Pech:
Auf der Maschine läuft Version 4.0.21... verdammt..


----------

