PHP Forum

PHP Forum (http://www.selfphp.de/forum/index.php)
-   MySQLi/PDO/(MySQL) (http://www.selfphp.de/forum/forumdisplay.php?f=22)
-   -   Abfrage über fünf Tabellen (http://www.selfphp.de/forum/showthread.php?t=23496)

KTB 12.08.2010 15:36:09

Abfrage über fünf Tabellen
 
Hallo zusammen, da ich nun wieder etwas mehr mit SQL zu tun habe, bin ich auch hier mal wieder zu Wege.
Zu meinem Problem:
Ich möchte aus einer Tabelle gleichzeitig drei weitere abfragen,welche Informationen aus einer weiteren beziehen. Hört sich komisch an, deshalb mal hier die Tabellen:
Code:

Arbeitsplatz:
ID|ID_PC|ID_DRUCKER|ID_TELEFON
--+-----+----------+----------
01| 1001|      2001|      3001
02| 1002|      2002|      3002

PC:
ID  |ID_HERST|IP_ADDRESS|BEMERKUNG
----+--------+----------+---------
1001|    9001|1.1.100.11|    nein
1002|    9002|1.1.100.12|    jein
1003|    9003|1.1.100.13|    eine

Drucker:
ID  |ID_HERST|IP_ADDRESS|BEMERKUNG
----+--------+----------+---------
2001|    9004|1.1.100.14|  druckt
2002|    9005|1.1.100.15|    lala
2003|    9006|1.1.100.16|    abcd

Telefon:
ID  |ID_HERST|IP_ADDRESS|BEMERKUNG
----+--------+----------+---------
3001|    9007|99.1.10.11|    ring
3002|    9008|99.1.10.12|    lolo
3003|    9009|99.1.10.13|    biep

Hersteller:
ID  |H_NAME|FARBE    |BEMERKUNG
----+------+----------+---------
9001|FSC  |grau      |sauber
9002|Medion|weiß      |sauber
9003|Acer  |grau      |staubig
9004|HP    |grau      |OK
9005|Canon |schwarz  |staubig
9006|Epson |grau      |staubig
9007|Siemen|rot      |gut
9008|Siemen|grau      |gut
9009|AEG  |schwarz  |alt

Nun möchte ich aus der Arbeitsplatztabelle folgende Ausgabe erzeugen:
Code:

Arbeitsplatz:
ID|PC_HN |PC_IPADDRESS|DRUCKER_HN|TELEFON_HN
--+------+------------+----------+----------
01|FSC  |1.1.100.11  |Canon    |Siemen
02|Medion|1.1.100.12  |Epson    |Siemen

Ich möchte also immer die IP-Adresse, aber auch den Herstellernamen der jeweiligen Arbeitsplatzkomponente wissen.
Wie bekomme ich das am besten hin?

vt1816 12.08.2010 15:39:18

AW: Abfrage über fünf Tabellen
 
Zitat:

Zitat von KTB (Beitrag 137560)
[..]
Wie bekomme ich das am besten hin?

JOIN

KTB 12.08.2010 16:13:40

AW: Abfrage über fünf Tabellen
 
Das ist mir schon klar, jedoch scheitere ich bisher an dem Problem, dass ich mir nicht im klaren bin, wie ich jedesmal neu auf die Herstellertabelle zugreifen kann. Verbinde ich die Herstellertabelle über den Drucker, wird der passende Hersteller-Datensatz für den Drucker angezeigt. Jetzt ist mir nicht klar wie ich in der gleichen abfrage das gleiche nochmal für PC oder Telefon machen soll.

vt1816 12.08.2010 16:22:15

AW: Abfrage über fünf Tabellen
 
Zitat:

Zitat von KTB (Beitrag 137562)
[..], jedoch scheitere ich bisher an dem Problem, dass ich mir nicht im klaren bin, wie ich jedesmal neu auf die Herstellertabelle zugreifen kann. Verbinde ich die Herstellertabelle über den Drucker, ...

Wie sieht Dein SQL-Statment bisher aus?

Der-Dennis 13.08.2010 11:18:07

AW: Abfrage über fünf Tabellen
 
Hallo KTB,

Zitat:

Zitat von KTB (Beitrag 137562)
Jetzt ist mir nicht klar wie ich in der gleichen abfrage das gleiche nochmal für PC oder Telefon machen soll.

Du suchst wahrscheinlich einen Self Join.

Gruß, Dennis

KTB 16.08.2010 09:08:42

AW: Abfrage über fünf Tabellen
 
Also bisher sieht es so aus:
Code:

SELECT HER1.H_NAME,HER2.H_NAME,HER3.H_NAME FROM
Hersteller AS HER1 RIGHT JOIN
(Arbeitsplatz AS AR1 LEFT JOIN PC ON AR1.ID_PC = PC.ID)
ON HER1.ID = PC.ID_HERST,
Hersteller AS HER2 RIGHT JOIN
(Arbeitsplatz AS AR2 LEFT JOIN Drucker ON AR2.ID_DRUCKER = Drucker.ID)
ON HER2.ID = Drucker.ID_HERST,
HERSTELLER AS HER3 RIGHT JOIN
(Arbeitsplatz AS AR3 LEFT JOIN Telefon ON AR3.ID_TELEFON = Telefon.ID)
ON HER3.ID = Telefon.ID_HERST
;

Dies gibt mir aber logischerweise 8 Zeilen zurück, da er "alles mit allem" verbindet:
Code:

FSC  |HP  |Siemen
Medion|HP  |Siemen
FSC  |Canon|Siemen
Medion|Canon|Siemen
FSC  |HP  |Siemen
Medion|HP  |Siemen
FSC  |Canon|Siemen
Medion|Canon|Siemen

Hey Dennis, Self Join hört sich nicht schlecht an, das werde ich mir sofort anschauen :)

KTB 16.08.2010 09:21:32

AW: Abfrage über fünf Tabellen
 
Kann es sein, dass mir nur folgende Zeile gefehlt hat?
Code:

WHERE AR1.ID = AR2.ID AND AR2.ID = AR3.ID
Das komplet also so lauten muss:
Code:

SELECT HER1.H_NAME,HER2.H_NAME,HER3.H_NAME FROM
Hersteller AS HER1 RIGHT JOIN
(Arbeitsplatz AS AR1 LEFT JOIN PC ON AR1.ID_PC = PC.ID)
ON HER1.ID = PC.ID_HERST,
Hersteller AS HER2 RIGHT JOIN
(Arbeitsplatz AS AR2 LEFT JOIN Drucker ON AR2.ID_DRUCKER = Drucker.ID)
ON HER2.ID = Drucker.ID_HERST,
HERSTELLER AS HER3 RIGHT JOIN
(Arbeitsplatz AS AR3 LEFT JOIN Telefon ON AR3.ID_TELEFON = Telefon.ID)
ON HER3.ID = Telefon.ID_HERST
WHERE AR1.ID = AR2.ID AND AR2.ID = AR3.ID
;

Das Ergebnis scheint nämlich zu stimmen, oder ist das nur Zufall oder gar viel zu umständlich?


Alle Zeitangaben in WEZ +2. Es ist jetzt 23:43:31 Uhr.

Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.