Julia: SQL-Abfrage über mehrere Tabellen

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:

  • wie heißen die Programme, zu denen er/sie mindestens eine Version geschrieben hat? (immer mit der Einschränkung AutorID = 5)
  • welches ist die höchste Version eines Programms, zu dem er/sie mindestens eine Version geschrieben hat?
  • welche ProgrammVersionsID hat diese höchste Version? (damit ich direkt dorthin verlinken kann)

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

  1. 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

    1. 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

      1. 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

        1. 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

    2. 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

  2. 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

    1. 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:

      • welches ist die höchste Version eines Programms, zu dem er/sie mindestens eine Version geschrieben hat, und welche ProgrammVersionsID hat diese Version?

      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

      1. yo Julia,

        Ich arbeite mit mySQL 2.14 (muß nochmal nachsehen)

        das solltest du auf jeden fall, 2.14 wäre ein desaster....

        Ilja

        1. 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

          1. 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";

            1. Hi,
              in dem Fall genauso:

              "Server Version: 5.0.26"

              Viele Grüße,
              Julia