Dieselbe Tabelle mehrfach joinen

Dieselbe Tabelle mehrfach joinen

am 14.11.2006 23:44:21 von Tobias Fratnik

Hi!

Folgende Frage: Nehmen wir wieder an, ich habe eine Tabelle mit Terminen:

TABLE events
uid INT PRIMARY KEY
date_start DATETIME
description VARCHAR

Zusätzlich habe ich eine Tabelle, in der die Teilnehme stehen:

TABLE participants
uid PRIMARY KEY
event_id INT
last_name VARCHAR

Und einige weitere Tabellen, die z.B. die zugehörigen Orte etc.
enthalten. Wenn ich nun einen Termin (oder mehrere) auswähle, möchte ich
auch diese zugehörigen Daten haben. Das ginge natürlich, in dem ich alle
nötigen Tabellen auf einmal joine, hat aber den Nachteil, dass ein
Großteil der Daten im Ergebnis mehrfach ausgegeben wird (kartesisches
Produkt). Ich denke also, dass es in diesem Fall günstiger ist, die
Daten jeweils einzeln auszuwählen. Also erstmal die Termine, dann die
Teilnehmer, dann die Orte etc. und dann per Frontend zusammenbauen. Dazu
brauche ich als Grundlage die Termine, um die es geht. Dazu fallen mir
zwei Möglichkeiten ein: Subselects und Joins. Auf Subselects muss ich
verzichten, weil MySQL > 4.0.x nicht überall gegeben ist. Also bleiben
die Joins.

Solange ich die Termine direkt auswähle, ist es einfach: SELECT
description FROM events WHERE date_start BETWEEN ... AND ...; und danach
füge ich jeweils einen JOIN zu und ändere die ausgewählten Bezeichner.
Beispielsweise, um die Teilnehmer zu erfahren: SELECT last_name FROM
events JOIN participants WHERE events.date_start BETWEEN ... AND ...;

Nun wird die Anfrage, um die Termine auszuwählen, dynamisch erzeugt,
z.B. sollen die Termine auch anhand eines bestimmten Teilnehmers
ausgewählt werden können, und im Nachhinein möchte ich dann die jeweils
dazugehörigen Daten separat abfragen, indem ich eben die entsprechende
Tabell joine und die passenden Spalten wähle. Und damit kommen wir zur
Frage (endlich ;-)): Angenommen, die Tabelle ist bereits gejoint, weil
ich sie brauche, um die Events zu selektieren: Ist es möglich und wider
die guten Sitten, dieselbe Tabelle ggf. einfach nochmal zu joinen, oder
sollte ich das lieber bleiben lassen und das Frontend testen lassen, ob
die betreffende Tabelle schon gejoint ist (was aufwändiger wäre)? Muss
die Tabelle beim zweiten Join (so das geht) zwingenderzweise mittels AS
umbenannt werden? Wie sieht's mit der Performance aus?

Danke für's Lesen bis hierher und für allfällige Antorten,

Grüße,

Tobias

Re: Dieselbe Tabelle mehrfach joinen

am 15.11.2006 00:36:33 von Gregor Kofler

Tobias Fratnik meinte:

[puh]

> Frage (endlich ;-)): Angenommen, die Tabelle ist bereits gejoint, weil
> ich sie brauche, um die Events zu selektieren: Ist es möglich und wider
> die guten Sitten, dieselbe Tabelle ggf. einfach nochmal zu joinen

Sowieso. Ist durchaus gute Sitte.

....
from
t1
inner join t2 as foo on t1.x = foo.x
inner join t2 as bar on t1.y = bar.y
....

Ich nehme an für die DB macht es keinen Unterschied ob es sich um 3
verschiedene oder eben nur 2 doppelt gejointe Tabellen handelt.

Gregor



--
http://www.gregorkofler.at ::: Landschafts- und Reisefotografie
http://www.licht-blick.at ::: Forum für Multivisionsvorträge
http://www.image2d.com ::: Bildagentur für den alpinen Raum

Re: Dieselbe Tabelle mehrfach joinen

am 15.11.2006 04:06:59 von Thomas Rachel

Tobias Fratnik wrote:

> Hi!
>
> Folgende Frage: Nehmen wir wieder an, ich habe eine Tabelle mit
> Terminen:
>
> TABLE events
> uid INT PRIMARY KEY
> date_start DATETIME
> description VARCHAR
>
> Zusätzlich habe ich eine Tabelle, in der die Teilnehme stehen:
>
> TABLE participants
> uid PRIMARY KEY
> event_id INT
> last_name VARCHAR
>
> Und einige weitere Tabellen, die z.B. die zugehörigen Orte etc.
> enthalten. Wenn ich nun einen Termin (oder mehrere) auswähle, möchte
> ich auch diese zugehörigen Daten haben.


Soweit klar.

> Das ginge natürlich, in dem ich alle nötigen Tabellen auf einmal joine,
> hat aber den Nachteil, dass ein Großteil der Daten im Ergebnis mehrfach
> ausgegeben wird (kartesisches Produkt).

Kartesisches Produkt wäre AFAIK, wenn Du keine Verknüpfungsbedingung
angibst. Wenn Du im JOIN jedoch die Bedingung angibst, auf welche Felder
der JOIN greifen soll, sollte das recht einfach vonstatten gehen.


> Ich denke also, dass es in diesem Fall günstiger ist, die
> Daten jeweils einzeln auszuwählen. Also erstmal die Termine, dann die
> Teilnehmer, dann die Orte etc. und dann per Frontend zusammenbauen.

Kannst Du natürlich auch, aber ich denke mal, die Datenbank kann diesen
Vorgang optimiert ausführen.

Wie auch immer -


> Und damit kommen wir zur
> Frage (endlich ;-)): Angenommen, die Tabelle ist bereits gejoint, weil
> ich sie brauche, um die Events zu selektieren: Ist es möglich und wider
> die guten Sitten, dieselbe Tabelle ggf. einfach nochmal zu joinen, oder
> sollte ich das lieber bleiben lassen und das Frontend testen lassen, ob
> die betreffende Tabelle schon gejoint ist (was aufwändiger wäre)?

Nein, das ist kein Problem.


> Muss die Tabelle beim zweiten Join (so das geht) zwingenderzweise
> mittels AS umbenannt werden?

Ja, denn die beiden Einsatzzwecke der einen Tabelle sollen ja
unterschieden werden können. Daher müssen sie unterschiedliche Aliase
aufweisen. Ich benenne hier dann in der Regel beide Tabellen um, ist
aber wohl Geschmackssache.


Thomas
--
Kevin mit der Mami im Zoo vor dem Giraffenkäfig:
- Maaami, ein Haaase!
- Nein, Kevin, dieses ist kein Hase, dieses Tier ist eine Giraffe.
- So ein groosser Haaaase?