# [MySQL] n-zu-n Beziehung



## RedWraith (17. April 2008)

Hallo !

Ich habe Probleme damit eine bestimmte Abfrage in SQL zu formulieren. Und zwar geht es um folgendes:
Ich habe drei Tabellen, nämlich Crews, Personen und Zuweisung. 

Die Tabelle Crews enthält eine Crew_ID und einen Crew_namen und wird dazu genutzt, um die Crew eines Segelbootes zu beschreiben.

Die tabelle Personen enthält eine Person_ID sowie Daten zu einer Person (Person_name, Person_adresse, etc...) und wird genutzt um Daten zu Personen zu speichern.

Die Tabelle Zuweisung enthält ebenfalls eine Person_ID und Crew_ID und wird genutzt, um die Tabelle Crews und Personen zu verknüpfen.

Es gilt folgendes: Eine Person kann in mehreren Crews mitglied sein. Eine Crew kann mehrere Personen als Mitglied haben. Das Ganze ist also eine n-zu-n Beziehung.

Was ich nun erreichen möchte ist eine Abfrage, mit der ich alle Person_IDs bekommen kann die nicht in einer bestimmten Crew angehören. Bisher hab ich folgendes zustande gebracht:

```
SELECT P.Person_ID, Z.Crew_ID FROM Personen P LEFT JOIN Zuweisung Z ON P.Person_ID = Z.Person_ID WHERE Crew_ID != 2
```

Was folgendes Ergebnis liefert:

```
Person_ID, Crew_ID
1, 1
2, 1
3, NULL
```

Das Problem ist, dass er die Person_ID = 2 trotzdem anzeigt, obwohl es in der Tabelle Zuweisung einen Datensatz (Person_ID = 2, Crew_ID = 2) gibt, der rausgefiltert werden müsste.

Tja ich hab leider nicht die geringste Ahnung, wie ich das genau zustande bringen kann.
Ich hoffe nur, dass ich mich verständlich machen konnte und dass mich einer von euch erleuchten kann.



Hier mal rudimentär der Aufbau der Datenbank samt Inhalt:

```
Tabelle Personen:
Person_ID INT Primary Key,
Person_name STRING

Inhalt:
Person_ID, Person_name
1, "Manfred"
2, "Max"
3, "Rüdiger"


Tabelle Crews:
Crew_ID INT Primary Key,
Crew_name STRING

Inhalt:
Crew_ID, Crew_name
1, "Männer mit Bärten"
2, "Die Krassen"


Tabelle Zuweisung:
Crew_ID INT,
Person_ID INT,
CONSTRAINT fk1_Zuweisung FOREIGN KEY (Person_ID)
REFERENCES Personen (Person_ID),
CONSTRAINT fk2_Zuweisung FOREIGN KEY (Crew_ID)
REFERENCES Crews(Crew_ID)

Inhalt:
Crew_ID, Person_ID
1, 1
1, 2
2, 2
```


----------



## katosan (17. April 2008)

hmm eigentlich sehe ich dein problem nicht, außer das die zuweisungstabelle keinen index hat

sollte doch die abfrage 


```
select * from Personen as a, Crew as b, Zuweisen as z where a.id = z.PersonenID and b.id = z.CrewID  and z.CrewId =2
```

die crew 2 liefern


gruß

kato


----------



## RedWraith (19. April 2008)

Hmmm also folgendes, wenn ich folgendes ausführe:

```
SELECT Crew_ID, Person_ID FROM Zuweisung
```

Erhalte ich folgendes Ergebnis:

```
Crew_ID, Person_ID
1, 1
1, 2
2, 2
```

Wenn ich jetzt alle Person_IDs haben will, die NICHT der Crew_ID 2 zugewiesen sind, könnte ich ja folgendes machen:

```
SELECT Crew_ID, Person_ID FROM Zuweisung WHERE Crew_ID != 2
```

Das Problem ist, dass das folgendes Ergebnis liefert:

```
Crew_ID, Person_ID
1, 1
1, 2
```

Wie man sieht, werden die Person_ID 1 und 2 angezeigt. Syntaktisch ist das richtig, aber nicht ganz das, was ich erreichen möchte.
Mein Problem dabei ist nun, dass die Peron_ID 2 angezeigt wird, da diese nicht nur der Crew_ID 1 zugewiesen sondern auch Crew_ID 2 und genau das müsste ich eliminieren. 

Ich möchte wirklich nur die Peron_IDs angezeigt kommen die in garkeinem Verhältnis zu einer bestimmten Crew stehen.

Vielleicht noch zum Hintergrund: Ich bastle im Moment an der Oberfläche, mit der man Personen einer Crew zuweisen kann und da möchte ich eine Liste mit Personen anzeigen, aus denen der Benutzer einen auswählt um ihn dann mit einem Klick auf OK zur Crew hinzuzufügen. Mein Problem ist dass, egal wie ich es drehe und wende, in dieser Liste immer wieder Personen auftauchen, die bereits in dieser Crew vorhanden sind, was denkbar schlecht ist, da ich dem Benutzer nicht die Möglichkeit geben will, eine Person quasi doppelt hinzuzufügen (Was Datenbanktechnisch nicht geht, da die Zuweisungstabelle einen Primärschlüssel(Crew_ID, Person_ID) hat).

mfg

Red


----------

