SQL-Abfrage über mehrere Tabellen
Julia
- datenbank
Hi,
ich sitze gerade an einer SQL-Abfrage über mehrere Tabellen und habe ein riesiges Brett vorm Kopf... vielleicht kann mir hier jemand helfen?
Ich habe drei Tabellen: Programme, ProgrammVersion und Prog_Autor:
Tabelle Programme:
ProgrammID | Name
----------------------------------------
1 | Programm1
2 | Programm2
Tabelle ProgrammVersion:
ProgrammVersionsID | ProgrammID | VersionsNr
----------------------------------------------------
1 | 1 | 01.00
2 | 1 | 02.00
3 | 1 | 01.01
4 | 2 | 01.00
Tabelle Prog_Autor:
Schluesselfeld | ProgrammVersionsID | AutorID
-------------------------------------------------------
1 | 1 | 5
2 | 2 | 5
3 | 3 | 5
4 | 4 | 5
Die Beziehungen sind sprechend:
Programme.ProgrammID = ProgrammVersion.ProgrammID
ProgrammVersion.ProgrammVersionsID = Prog_Autor.ProgrammVersionsID
Der Programmierer mit der ID 5 hat also an 4 Programmversionen mitgewirkt: eine von RH130002, 3 von RH130001.
Ich will jetzt eine Ausgabe haben:
sprich also:
Name höchste Versionsnr. ProgrammVersionsID dieser Version
RH130001 02.00 2
RH130002 01.00 4
Ich hoffe, ihr könnt mir folgen. Mit der höchsten Version tue ich mich gerade sehr schwer... bin dankbar über jeden, der mir auf die Sprünge hilft!
MfG
Julia
Hoi,
wie sehen deine bisherigen Versuche aus?
Das Thema JOINs kennst du? Ein EXISTS Operator könnte u.U. auch hilfreich sein. Auch korrelierende Unterabfragen können zum Erfolg beitragen.
Übrigens, dieser Name RH13001 taucht in deinen Beispiel Daten nicht wirklich auf.
Was du unbedingt noch nennen solltest, ist das Datenbanksystem, mit welchem du arbeitest und die Version davon.
Gruss, Frank
Hi Frank,
schon mal vielen Dank für die Antwort!
wie sehen deine bisherigen Versuche aus?
Sorry, hab da wohl etwas wenig erzählt. Ich kenne mich mit SQL aus, Joins natürlich, Unterabfragen...
Klar habe ich versuch zu joinen:
SELECT Name, ProgrammVersionsID FROM Programme INNER JOIN ProgrammVersion ON Programme.ProgrammID = ProgrammVersion.ProgrammID INNER JOIN Prog_Autor ON Prog_Autor.ProgrammVersionsID = ProgrammVersion.ProgrammVersionsID
wo ich völlig festhänge: wie kriege ich nicht nur die höchste VersionsNr je Programm, sondern die ProgrammVersionsID dieser höchsten Version?
Übrigens, dieser Name RH13001 taucht in deinen Beispiel Daten nicht wirklich auf.
Gerade gesehen... hatte die Testdatensätze geändert, aber die Ausgabe noch nicht. Wenn ich wüßte, ich bin auf dem richtigen Weg und es scheitert an einem falsch eingegebenen Tabellennamen oder so - das würde ich denke ich mal schnell rauskriegen. So tappe ich aber völlig im Dunkeln wegen der ProgrammVersionsID der höchsten Version...
Was du unbedingt noch nennen solltest, ist das Datenbanksystem, mit welchem du arbeitest und die Version davon.
mySQL 2.14 (glaube ich, gucke morgen mal nach)
Viele Grüße und einen schönen Abend,
Julia
yo,
wo ich völlig festhänge: wie kriege ich nicht nur die höchste VersionsNr je Programm, sondern die ProgrammVersionsID dieser höchsten Version?
hast du dich schon mit meinen hinweis, korrelierte unterabfragen zu benutzen, auseinander gesetzt oder hast du dazu noch fragen ? darin wird wohl eine lösung für dich bestehen.
Ilja
Hi,
hast du dich schon mit meinen hinweis, korrelierte unterabfragen zu benutzen, auseinander gesetzt oder hast du dazu noch fragen ? darin wird wohl eine lösung für dich bestehen.
das habe ich, die kenne ich sogar - aber ich habe nicht nur ein Brett, sondern offenbar einen ganzen Wald vorm Kopf und komme auf keine Lösung.
MfG
Julia
Hi nochmal,
Schande über mein Haupt... hab ich verwechselt. phpMyAdmin war die Version 2.10.1
"MySQL-Client-Version: 5.0.26"
Sorry nochmal!
Viele Grüße,
Julia
yo,
- wie heißen die Programme, zu denen er/sie mindestens eine Version geschrieben hat? (immer mit der Einschränkung AutorID = 5)
das ist einfach, ein join über alle drei tabellen mit einem DISTINCT gewürtzt.
SELECT DISTINCT p.name
FROM prgramme p
INNER JOIN ProgrammVersion pv ON pv.ProgrammID = p.ProgrammID
INNER JOIN Prog_Autor pa ON pa.ProgrammVersionsID = pv.ProgrammVersionsID
WHERE pa.AutorID = 5
;
- welches ist die höchste Version eines Programms, zu dem er/sie mindestens eine Version geschrieben hat?
das geht mit einer korrelierten unterabfrage, wobei du die version als string gespeichert hast, man müsste sie vorher in eine zahl Casten. wie diese funktion aussihet, hängt von deiner version und dbms ab. auch ob es unterabfragen untestützt.
- welche ProgrammVersionsID hat diese höchste Version? (damit ich direkt dorthin verlinken kann)
das gleiche wie bei der höchsten version, nur eben die id ausgeben.
Ilja
Hi Ilja,
habe eben schon unter Franks Posting einige Dinge abgeklärt. Meine Infos waren wohl ein wenig dürftig!
Ich arbeite mit mySQL 2.14 (muß nochmal nachsehen) und bin recht fit in SQL - Joins und Unterabfragen sind also nichts neues.
Mein Hauptproblem:
und vor allem: alle drei Dinge in einer Abfrage... momentan hänge ich da völlig fest.
das geht mit einer korrelierten unterabfrage, wobei du die version als string gespeichert hast, man müsste sie vorher in eine zahl Casten. wie diese funktion aussihet, hängt von deiner version und dbms ab. auch ob es unterabfragen untestützt.
Wenn das notwendig ist, kann ich das auch als Zahl speichern. Hatte aber bisher den Eindruck, daß mySQL das so nimmt.
Vielen lieben Dank und viele Grüße,
Julia
yo Julia,
Ich arbeite mit mySQL 2.14 (muß nochmal nachsehen)
das solltest du auf jeden fall, 2.14 wäre ein desaster....
Ilja
Hi nochmal,
Schande über mein Haupt... hab ich verwechselt. phpMyAdmin war die Version 2.10.1
"MySQL-Client-Version: 5.0.26"
Sorry nochmal!
Viele Grüße,
Julia
echo $begrüßung;
"MySQL-Client-Version: 5.0.26"
Frage bitte den Server, welche Version er hat, nicht welche Client-API verwendet wird. Beide Versionen können gleich sein, müssen das aber nicht. Ein Client (mit seiner einen API-Version) kann sich mit beliebig vielen Servern mit unterschiedlichen Versionen verbinden. Nach der Verbindung ein SELECT VERSION() absetzen, oder dem phpMyAdmin auf die Startseite schauen (vorher gegebenenfalls den konkreten Server wählen) und unter "Server Version" nachsehen.
echo "$verabschiedung $name";
Hi,
in dem Fall genauso:
"Server Version: 5.0.26"
Viele Grüße,
Julia