phpbar.de logo

Mailinglisten-Archive

[php] SQL-Abfrage mehrere Tabellen

[php] SQL-Abfrage mehrere Tabellen

Lutz Zetzsche Lutz.Zetzsche at sea-rescue.de
Die Okt 30 16:48:55 CET 2007


Hallo Dennis,

Am Dienstag, 30. Oktober 2007 schrieb Dennis Dohle:
> ich versuche gerade, ein System von mir etwas schneller zu machen. An
> einer Stelle bin ich mir da nicht sicher, ob das nicht einfacher
> geht.
>
> Ich habe z.B. zwei Tabellen.
>
> Tabelle 1: personen
> Felder: id, vorname, name, std_telefon, std_fax
>
> Tabelle 2: kommunikationen
> Felder: id, typ, kommunikation
>
> In der Tabelle 2 stehen also z.B. alle Telefonnummern etc., die dann
> mit der id in den Standardfelder (z.B. std_telefon) der Tabelle 1
> abgelegt sind.
>
> Jetzt möchte ich eine Abfrage über die Tabelle 1 machen, und
> gleichzeitig die Kommunikationen erhalten, die ja als ids in den
> Feldern std_telefon und std_fax enthalten sind.
>
> Grundsätzlich nichts Schwieriges, das mit dem LEFT JOIN-Attribut
> gelöst werden kann. Nur habe ich ja jetzt zwei
> Standardkommunikations-IDs in der Tabelle 1 und möchte beide
> "übersetzt" haben. Darum frage ich das derzeit wie folgt ab:
>
> SELECT
> 	A.vorname, A.name,
> 	B.kommunikation AS telefon,
> 	C.kommunikation AS fax
> FROM
> 	personen AS A
> LEFT JOIN
> 	kommunikationen AS B ON B.id=A.std_telefon
> LEFT JOIN
> 	kommunikationen AS C ON C.id=A.std_fax
>
>
> Funktioniert wunderbar! Aber kann man das nicht auch anders lösen, so
> dass ich nur einmal die Tabelle "kommunikationen" ansprechen muss?
> Denn in meinem System habe ich noch weitere Standardfelder wie
> "mobil", "email" und "homepage". Dann müsste ich insgesamt fünf mal
> ein LEFT JOIN machen, dass sieht mir sehr unsauber aus ...

ein JOIN über drei Tabellen ist hier sehr unschön. Wenn die Datenbank 
wächst, werden plötzlich gewaltige Datenmengen bewegt. Das Ganze wird 
dann sehr langsam.

Der eigentliche Fehler liegt aber in Deiner Datenbankstruktur. Am Besten 
verwendest Du eine Verknüpfungstabelle:

	Tabelle 1: personen
	Felder: id, vorname, name

	Tabelle 2: kommunikationen
	Felder: id, typ, kommunikation

	Tabelle 3: personen_kommunikationen
	Felder: id_person, id_kommunikation

Dann kannst Du die Daten mit einem einzigen Dreifach-JOIN abfragen, 
gleich wieviel Kommunikationswege Du auslesen willst. Die 
Verknüpfungstabelle mit zwei ID-Spalten ist bei dem Dreifach-JOIN dann 
auch leichtgewichtiger.

Allerdings wäre es aus datentechnischer Sicht überlegenswert, erst die 
Tabelle personen auszulesen - inklusive id - und dann mit den IDs über 
die Verknüpfungstabelle die Tabelle kommunikationen auszulesen und die 
Daten dann in der Anwendung zusammenzuführen. Dadurch vermeidest Du, 
daß die Datenbank Daten (name, vorname) mehrfach liefert, die nur 
einmal benötigt werden.


Viele Grüße,

Lutz

php::bar PHP Wiki   -   Listenarchive