INNER JOIN für mehrere Spalten?!
Hallo Admins,
ich habe mal wieder eine kleine Problemstellung für euch, bei der ich grade nicht weiterkomme:
Ich bin grade dabei ein kleines PHP-Tool (+mysql) zu entwickeln, dass ein paar Anwendungen managen soll.
Folgende Situation:
Tabelle "Benutzer":
ID | Vorname | Nachname | Tel | Email
Tabelle "Anwendungen":
AnwendungsID | Name | URL | Version | AnwendungAP | BetriebsAP | TechnikAP (wobei AP für Ansprechpartner steht)
Jetzt möchte ich gerne alle Anwendungen mit meinem PHP-Script in einer Tabelle ausgeben lassen (kein Problem).
Das Besondere dabei ist, dass sich hinter den Tabellenspalten der APs (z.B. "AnwendungsAP") nur die IDs der zugeordnetetn Benutzer liegt, anstatt
der ausgeschriebenen Namen.
Diese "fehlende" Verknüpfung möchte ich jetzt gerne mit dem INNER JOIN-Befehl herstellen, was bei einer AP-Spalte kein Problem ist:
SELECT Anwendungen.ID, Benutzer.ID, Benutzer.Vorname, Benutzer.Nachname, Name, URL, Version, AnwendungAP
FROM Anwendungen INNER JOIN Benutzer ON AnwendungAP = Benutzer.ID;
Wie gestalte ich denn den SQL-Query, wenn ich jetzt noch die anderen APs verknüpfen möchte?
geht das überhaupt oder muss ich dann für jede Saplte nen eigenen Query erstellen?!
Danke schon jetzt für eure Hilfe!
Gruß
Chribu
ich habe mal wieder eine kleine Problemstellung für euch, bei der ich grade nicht weiterkomme:
Ich bin grade dabei ein kleines PHP-Tool (+mysql) zu entwickeln, dass ein paar Anwendungen managen soll.
Folgende Situation:
Tabelle "Benutzer":
ID | Vorname | Nachname | Tel | Email
Tabelle "Anwendungen":
AnwendungsID | Name | URL | Version | AnwendungAP | BetriebsAP | TechnikAP (wobei AP für Ansprechpartner steht)
Jetzt möchte ich gerne alle Anwendungen mit meinem PHP-Script in einer Tabelle ausgeben lassen (kein Problem).
Das Besondere dabei ist, dass sich hinter den Tabellenspalten der APs (z.B. "AnwendungsAP") nur die IDs der zugeordnetetn Benutzer liegt, anstatt
der ausgeschriebenen Namen.
Diese "fehlende" Verknüpfung möchte ich jetzt gerne mit dem INNER JOIN-Befehl herstellen, was bei einer AP-Spalte kein Problem ist:
SELECT Anwendungen.ID, Benutzer.ID, Benutzer.Vorname, Benutzer.Nachname, Name, URL, Version, AnwendungAP
FROM Anwendungen INNER JOIN Benutzer ON AnwendungAP = Benutzer.ID;
Wie gestalte ich denn den SQL-Query, wenn ich jetzt noch die anderen APs verknüpfen möchte?
geht das überhaupt oder muss ich dann für jede Saplte nen eigenen Query erstellen?!
Danke schon jetzt für eure Hilfe!
Gruß
Chribu
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 117912
Url: https://administrator.de/contentid/117912
Ausgedruckt am: 25.11.2024 um 19:11 Uhr
5 Kommentare
Neuester Kommentar
Moin Chribu,
rein formal kannst Du es so lösen:
wenn denn alle xxxAP-Spalten NOT NULLABLE sind und auch gültige BenutzerIDs enthalten.
Falls aber einzelne dieser Felder (noch) leer sind, würde ich es eher über einen UNION lösen.
Eigentlich würde ich ohnehin die Lösüng über ein UNION vorziehen und alle vorhandenen xxxAP-Namen, xxxAP-Vormanem etc jeweils untereinander auflisten so wie heute in der AP-Tabelle die xxxAP-IDs untereineinander stehen.
Grüße
Biber
rein formal kannst Du es so lösen:
SELECT A.ID,
AAP.Vorname As AAPVorname, AAP.Nachname as AAPNachname,
BAP.Vorname As BAPVorname, BAP.Nachname as BAPNachname,
TAP.Vorname As TAPVorname, TAP.Nachname as TAPNachname,
A.Name, A.URL, A.Version
FROM Anwendungen A
JOIN Benutzer AAP ON A.AnwendungAP = AAP.ID
JOIN Benutzer BAP ON A.BetriebsAP = BAP.ID
JOIN Benutzer TAP ON A.TechnikAP = TAP.ID
;
Falls aber einzelne dieser Felder (noch) leer sind, würde ich es eher über einen UNION lösen.
Eigentlich würde ich ohnehin die Lösüng über ein UNION vorziehen und alle vorhandenen xxxAP-Namen, xxxAP-Vormanem etc jeweils untereinander auflisten so wie heute in der AP-Tabelle die xxxAP-IDs untereineinander stehen.
Grüße
Biber
Moin Chribu,
nein, ich gehe natürlich nicht davon aus, dass es eine spezielle "AnwendungsAP"-Tabelle und eine spezielle "TechnikAP"-Tabelle und eine spezielle "BetriebsAP"-Tabelle gibt... wer sollte so ein verrückte Tabellendesign konzipiert haben?
Nein, ich verJOINe die Tabelle "Benutzer" dreimal und spreche sie unter verschiedenen ALIASen an (einmal als AAP wie AnwendungsAnsprechpartner, einmal als BAP wie BetriebsAP und einmal als TAP wie TechnikAP)
Die Tabelle "Anwendungen" spreche ich unter dem ALIAS A an - und im "SELECT felder"-Teil der Query kann ich dann mit dem ALIAS als Präfix vor den Feldnamen genau und eindeutig angeben, wann ich welches Feld aus welcher Tabelle/aus welchem JOIN ich auf dem Schirm haben möchte.
Jag doch die Query einmal hoch zum Server - ist doch nur eine SELECT/Lese-Query.
Grüße
Biber
nein, ich gehe natürlich nicht davon aus, dass es eine spezielle "AnwendungsAP"-Tabelle und eine spezielle "TechnikAP"-Tabelle und eine spezielle "BetriebsAP"-Tabelle gibt... wer sollte so ein verrückte Tabellendesign konzipiert haben?
Nein, ich verJOINe die Tabelle "Benutzer" dreimal und spreche sie unter verschiedenen ALIASen an (einmal als AAP wie AnwendungsAnsprechpartner, einmal als BAP wie BetriebsAP und einmal als TAP wie TechnikAP)
Die Tabelle "Anwendungen" spreche ich unter dem ALIAS A an - und im "SELECT felder"-Teil der Query kann ich dann mit dem ALIAS als Präfix vor den Feldnamen genau und eindeutig angeben, wann ich welches Feld aus welcher Tabelle/aus welchem JOIN ich auf dem Schirm haben möchte.
Jag doch die Query einmal hoch zum Server - ist doch nur eine SELECT/Lese-Query.
Grüße
Biber
Moin Moin
AAP, BAP, und TAP sind Aliase der Tabelle Benutzer.
Vieleich wird Bibers Vorschlag so deutlicher:
Gruß L.
/Edit
Mist, schon wieder zu lahm.
AAP, BAP, und TAP sind Aliase der Tabelle Benutzer.
Vieleich wird Bibers Vorschlag so deutlicher:
SELECT A.ID,
AAP.Vorname As AAPVorname, AAP.Nachname as AAPNachname,
BAP.Vorname As BAPVorname, BAP.Nachname as BAPNachname,
TAP.Vorname As TAPVorname, TAP.Nachname as TAPNachname,
A.Name, A.URL, A.Version
FROM Anwendungen as A
JOIN Benutzer as AAP ON A.AnwendungAP = AAP.ID
JOIN Benutzer as BAP ON A.BetriebsAP = BAP.ID
JOIN Benutzer as TAP ON A.TechnikAP = TAP.ID
Gruß L.
/Edit
Mist, schon wieder zu lahm.