Intersectiontabelle Join

Intersectiontabelle Join

am 17.08.2005 15:19:37 von maumi

Hallo zusammen,

ich habe folgende Tabellenstruktur


Tabelle_Personen
ID|Name|Vorname

Tabelle_Projekte
ID|Name|Beschreibung

Tabelle_Mitarbeit
ID|PersonenID|ProjektID

Mein Problem ist, dass ich nicht weiß wie ich die Tabellen mit einer
einfachen SQL-Abfrage kombinieren kann. Ich möchte wissen, welche
Personen alle an einem Projekt beteiligt sind. Soweit ich weiß funzt
das mit JOIN. Hab es aber noch nicht richtig hinbekommen.

Vielen Dank

Christian

Re: Intersectiontabelle Join

am 17.08.2005 15:35:48 von Stefan Rybacki

Christian Mimberg wrote:
> Hallo zusammen,
>
> ich habe folgende Tabellenstruktur
>
>
> Tabelle_Personen
> ID|Name|Vorname
>
> Tabelle_Projekte
> ID|Name|Beschreibung
>
> Tabelle_Mitarbeit
> ID|PersonenID|ProjektID
>
> Mein Problem ist, dass ich nicht weiß wie ich die Tabellen mit einer
> einfachen SQL-Abfrage kombinieren kann. Ich möchte wissen, welche
> Personen alle an einem Projekt beteiligt sind. Soweit ich weiß funzt
> das mit JOIN. Hab es aber noch nicht richtig hinbekommen.
>

Ja genau mit JOIN:

SELECT * FROM tabelle_personen tp JOIN tabelle_mitarbeit tm ON tm.personenid=tp.id JOIN
tabelle_projekte tp ON tm.projektid=tp.id

Allerdings fallen hier Personen raus, die nirgends mitarbeiten. Abhilfe schafft hier ein
OUTER JOIN

SELECT * FROM tabelle_personen tp LEFT OUTER JOIN tabelle_mitarbeit tm ON
tm.personenid=tp.id JOIN tabelle_projekte tp ON tm.projektid=tp.id

Bis denn dann
Stefan

> Vielen Dank
>
> Christian
>

Re: Intersectiontabelle Join

am 17.08.2005 16:54:25 von maumi

Hallo,

erst einmal Danke...

Mußte den Quellcode glaub ich wie folgt abändern...

> SELECT * FROM tabelle_personen tp JOIN tabelle_mitarbeit tm ON tm.persone=
nid=3Dtp.id JOIN
> tabelle_projekte tp ON tm.projektid=3Dtp.id

SELECT * FROM tabelle_personen tp JOIN tabelle_mitarbeit tm ON
tm.personenid=3Dtp.id JOIN
tabelle_projekte TPR ON tm.projektid=3DTPR.id


Vielleicht kannst Du mir jetzt noch sagen, wie ich die Sachen passend
aus dem Result herausbekomme.

Also von der Struktur her...

Projekt1 - Person1
- Person2
- Person3

Projekt2 - Person2
- Person3
- Person4


Danke

Christian

Re: Intersectiontabelle Join

am 17.08.2005 20:19:24 von Niels Braczek

Christian Mimberg schrieb:

>> SELECT * FROM tabelle_personen tp JOIN tabelle_mitarbeit tm ON tm.personenid=tp.id JOIN
>> tabelle_projekte tp ON tm.projektid=tp.id
>
> SELECT * FROM tabelle_personen tp JOIN tabelle_mitarbeit tm ON
> tm.personenid=tp.id JOIN
> tabelle_projekte TPR ON tm.projektid=TPR.id

$sql = "SELECT tp.id, tm.person, tpr.project
FROM tabelle_personen tp
JOIN tabelle_mitarbeit tm
ON tm.personenid=tp.id
JOIN tabelle_projekte tpr
ON tm.projektid=tpr.id";

> Vielleicht kannst Du mir jetzt noch sagen, wie ich die Sachen passend
> aus dem Result herausbekomme.

Das ist trivial:

$projectMembers = array();
while ($row=mysql_fetch_assoc($result)) {
$projectMembers[$row['project']][$row['id']] = $row['person'];
}

MfG
Niels

--
| http://www.kolleg.de · Das Portal der Kollegs in Deutschland |
| http://www.bsds.de · BSDS Braczek Software- und DatenSysteme |
| Webdesign · Webhosting · E-Commerce · Mambo Content Management |
`----------------------------------------------------------- -----´

Re: Intersectiontabelle Join

am 17.08.2005 21:03:22 von Stefan Rybacki

Christian Mimberg wrote:
> Hallo,
>
> erst einmal Danke...
>
> Mußte den Quellcode glaub ich wie folgt abändern...
>
>
>>SELECT * FROM tabelle_personen tp JOIN tabelle_mitarbeit tm ON tm.personenid=tp.id JOIN
>>tabelle_projekte tp ON tm.projektid=tp.id
>
>
> SELECT * FROM tabelle_personen tp JOIN tabelle_mitarbeit tm ON
> tm.personenid=tp.id JOIN
> tabelle_projekte TPR ON tm.projektid=TPR.id
>

Upps, ja stimmt, TP war doppelt. Naja sollte schnell gehen ;)

> Vielleicht kannst Du mir jetzt noch sagen, wie ich die Sachen passend
> aus dem Result herausbekomme.
>
> Also von der Struktur her...
>
> Projekt1 - Person1
> - Person2
> - Person3
>
> Projekt2 - Person2
> - Person3
> - Person4
>
>

Antwort siehe Niels.

Bis denn dann
Stefan

> Danke
>
> Christian
>

Re: Intersectiontabelle Join

am 18.08.2005 12:42:46 von maumi

Super soweit funzt alles. Jetzt hab ich allerdings noch ein größeres
Problem.

Ich kann auf einer Seite ein Projekt auswählen. Auf der nächsten
Seite wird dieses Projekt dann angezeigt und in einem Formular (Option
select multiple) werden die passenden Bearbeiter angezeigt. Wenn ich
diesem Formular die Bearbeiter auswähle sollen diese in der
Intersection-Tabelle mit dem Projekt verbunden werden. Bei der
Neuanlage ist das kein Problem, aber wie mache ich ein Update. Also
eine Verknüpfung löschen, eine neue hinzufügen oder auf doppelte
überprüfen. Kann man UPDATE auch mit JOIN verknüpfen und wie sieht
es mit Dopplungen aus?

Vielen Dank

Christian

Re: Intersectiontabelle Join

am 18.08.2005 19:29:48 von Stefan Rybacki

Christian Mimberg wrote:
> Super soweit funzt alles. Jetzt hab ich allerdings noch ein größeres
> Problem.
>
> Ich kann auf einer Seite ein Projekt auswählen. Auf der nächsten
> Seite wird dieses Projekt dann angezeigt und in einem Formular (Option
> select multiple) werden die passenden Bearbeiter angezeigt. Wenn ich
> diesem Formular die Bearbeiter auswähle sollen diese in der
> Intersection-Tabelle mit dem Projekt verbunden werden. Bei der
> Neuanlage ist das kein Problem, aber wie mache ich ein Update. Also
> eine Verknüpfung löschen, eine neue hinzufügen oder auf doppelte
> überprüfen. Kann man UPDATE auch mit JOIN verknüpfen und wie sieht
> es mit Dopplungen aus?
>

Du brauchst hier kein JOIN in nem UPDATE, merke dir über die Seiten bloß die ProjektID. In
deinem Formular zeigst du die Mitarbeiter an, gibts den options allerdings die IDs als
value. Du brauchst dann bloß die Intersection Tabelle zu aktualisieren.
Du könntest ganz naiv alle zu dem Projekt gehörigen Mitarbeiter löschen und danach alle
aus dem Select erstellten Verknüpfungen per Insert wieder herstellen.
(Bei diesem Vorgehen verhinderst du automatisch Doppelungen, Doppelungen kann man noch
durch Primärschlüssel über beide Fremdschlüssel oder einen Unique index erreichen)

Bis denn dann
Stefan


> Vielen Dank
>
> Christian
>