Peter: Wie löse ich folgendes sql-Problem? (betrifft SELECT)

Hallo... ich versuche mich gerade an einer Bundesliga-Datenbank und habe bei der Spieltagsausgbe ein Problem. Wär schön, wenn jemand weiterhelfen könnte. Hier die Rahmenvoraussetzungen:

  1. in der Tabelle "teamnr" wird jedem Team eine Teamnummer zugeordnet, also z.B.

1,Arminia Bielefeld
2,Werder Bremen
.
.
.

  1. in der Tabelle "saisonspieltagspielnr1" besteht der Primärschlüssel aus "saison", "spieltag" und "spielnr". Diesem Schlüssel wird jeweils eine Teamnummer eines Teams mit Heimrecht zugeordnet, wobei die Teamnummer der Nummer in Tabelle "teamnr" (s.o.) entspricht. Z.B.

2002,1,1,1
(Bedeutet: Saison 2002, Spieltag 1, Spielnummer 1, Heimrecht für Teamnummer 1 (Arminia Bielefeld)

  1. Analog dazu existiert sdie Tabelle "saisonspieltagspielnr2" mit gleichem Primärschlüssel, nur das hier halt das Gastteam angegeben wird:

2002,1,1,2
(Bedeutet: Saison 2002, Spieltag 1, Spielnummer 1, Gastrecht für Teamnummer 2 (Werder Bremen)

Das Problem: Ich suche nach einer Abfrage, die mir als Ergebnis lediglich den Namen des Heimteams und den Namen des Gastteams in einer Zeile wiedergibt, also

Arminia Bielefeld Werder Bremen

Irgendwie ist das (jedenfalls für mich ;o) nicht so einfach, da sowohl die Heimteamnummer als auch die Gastteamnummer innerhalb EINER Abfrage mit der Tabelle "teamnr" verknüpft werden muß. Ich hab da keine Ahnung, wie das funktioniert.
Mit...

SELECT s1.heimteamnr, t1.name, s2.gastteamnr FROM teamnr t1, saisonspieltagspielnr1 s1, saisonspieltagspielnr2 s2 WHERE s1.saison = 2002 AND s1.spieltag = 1 AND t1.teamnr = s1.heimteamnr AND s1.saison = s2.saison AND s1.spieltag = s2.spieltag AND s1.spielnr = s2.spielnr

schaff isch es gerade mal, die Heimteamnummer mit dem korrekten Teamnamen zu verknüpfen und dazu die entsprechende Gastteamnummer anzuzeigen. Allerdings hab ich es noch nicht geschafft, diese Gastteamnummer innerhalb der gleichen Abfrage ebenfalls mit dem passenden Teamnamen zu Verknüpfen. Jemand 'ne Ahnung?

Dankeschön.

  1. Hi,

    1. in der Tabelle "saisonspieltagspielnr1" besteht der
      Primärschlüssel aus "saison", "spieltag" und "spielnr".
      Diesem Schlüssel wird jeweils eine Teamnummer eines Teams mit
      Heimrecht zugeordnet, wobei die Teamnummer der Nummer in Tabelle
      "teamnr" (s.o.) entspricht. Z.B.
    1. Analog dazu existiert sdie Tabelle "saisonspieltagspielnr2"

    warum verwendest Du zwei Tabellen und nicht nur eine?

    Viele Grüße
    <img src="http://www.schroepl.net/projekte/gzip_cnc/gzip_cnc.gif" border=0 alt=""> Michael

  2. Hallo,

    1. in der Tabelle "saisonspieltagspielnr1" besteht der Primärschlüssel aus "saison", "spieltag" und "spielnr". Diesem Schlüssel wird jeweils eine Teamnummer eines Teams mit Heimrecht zugeordnet, wobei die Teamnummer der Nummer in Tabelle "teamnr" (s.o.) entspricht. Z.B.
    2. Analog dazu existiert sdie Tabelle "saisonspieltagspielnr2" mit gleichem Primärschlüssel, nur das hier halt das Gastteam angegeben wird:

    Warum machst Du aus diesen beiden Tabellen nicht eine, in der die Saison, der Spieltag, die Spielnummer und die beiden 'Kontrahenten' angegeben sind. Meiner Meinung nahc ist eine Aufteilung hier nicht notwendig, ja sogar schlechtes Design.

    Das Problem: Ich suche nach einer Abfrage, die mir als Ergebnis lediglich den Namen des Heimteams und den Namen des Gastteams in einer Zeile wiedergibt, also ...

    Du mußt die Tabelle, in der die Teams abgespeichert ist ( den Namen 'teamnr' finde ich dafür auch nicht gerade ideal), zweimal einbinden:

    SELECT spiele.saison, spiele.datum, heimteam.name AS Heimmannschaft, gastteam.name AS Gastmannschaft
       FROM spiele
       JOIN teams AS heimteam ON heimteam.teamnr = spiele.heimteamnr
       JOIN teams AS gastteam ON gastteam.teamnr = spiele.gastteamnr

    (Ungetestet, in Ermangelung einer installierten mySQL-Version)

    Grüße
      Klaus

    1. Danke Klaus, werde das gleich morgen früh umsetzen :o)

      Warum machst Du aus diesen beiden Tabellen nicht eine, in der die Saison, der Spieltag, die Spielnummer und die beiden 'Kontrahenten' angegeben sind. Meiner Meinung nahc ist eine Aufteilung hier nicht notwendig, ja sogar schlechtes Design.

      ( den Namen 'teamnr' finde ich dafür auch nicht gerade ideal)

      So seh ich das auch. Ich hatte die beiden Tabellen schon in einer, habe sie aber im Rahmen meiner verzweifelten Versuche mal auseinander gerissen und dann angesichts der vorgerückten Stunde keine Lust mehr gehabt, alles nochmal umzustrukturieren ;o). Werd' ich aber auf jeden Fall noch ändern. Auch die abenteuerlichen Tabellennamen sind provisorisch... es geht mir momentan nur um das Erlernen des Prinzips.

      1. Mmmh.. funktioniert nicht, obwohl der Code, den Klaus angegeben hat, anscheinend richtig ist. Also ich habe das jetzt folgendermaßen versucht:


        Tabelle "spiele"

        1.Spalte: "saison"
        2.Spalte: "spieltag"
        3.Spalte: "spielnr"
        4.Spalte: "heimnr"
        5.Spalte: "gastnr"

        (es folgen weitere in diesem Zusammenhang unwichtige Spalten. Die ersten drei Spalten bilden den Primärschlüssel. Übrigens: Wär es evt. besser, "spielnr" im Primärschlüssel durch "heimnr" und "gastnr" zu ersetzen?)

        Beispielzeile:
        2002,1,1,1,2


        Tablle "teams"

        1.Spalte: "teamnr"
        2.Spalte: "name"
        ("teamnr" ist der Primärschlüssel)

        Beispielzeilen:
        1, Arminia Bielefeld
        2, Werder Bremen


        Wie gesagt soll durch eine Abfrage der Name des Heimteams und der Name des Gastteams in einer Zeile, also

        Arminia Bielefeld Werder Bremen

        ausgegeben werden. Analog zum Code aus Klaus' obigen Beitrag habe ich folgende "SELECT"-Anweisung getestet (es geht nur ums Prinzip, daher "ungefilterte" Daten):

        "SELECT heimteam.name AS Heimmannschaft, gastteam.name AS Gastmannschaft
        FROM spiele
        JOIN teams AS heimteam ON heimteam.teamnr = spiele.heimnr
        JOIN teams AS gastteam ON gastteam.teamnr = spiele.gastnr;"

        Daraufhin erscheint beim mysqladmin folgende Fehlermeldung:

        "You have an error in your SQL syntax near 'ON heimteam.teamnr = spiele.heimnr
        JOIN teams AS gastteam ON gastteam.teamnr =' at line 3"

        Was ist da los? Hat das irgendwas mit den Primärschlüsseln zu tun?

        1. Hab den Fehler gefunden: Statt "JOIN" mußte ich einfach "INNER JOIN" einsetzen :o)

          Mmmh.. funktioniert nicht, obwohl der Code, den Klaus angegeben hat, anscheinend richtig ist. Also ich habe das jetzt folgendermaßen versucht:


          Tabelle "spiele"

          1.Spalte: "saison"
          2.Spalte: "spieltag"
          3.Spalte: "spielnr"
          4.Spalte: "heimnr"
          5.Spalte: "gastnr"

          (es folgen weitere in diesem Zusammenhang unwichtige Spalten. Die ersten drei Spalten bilden den Primärschlüssel. Übrigens: Wär es evt. besser, "spielnr" im Primärschlüssel durch "heimnr" und "gastnr" zu ersetzen?)

          Beispielzeile:
          2002,1,1,1,2


          Tablle "teams"

          1.Spalte: "teamnr"
          2.Spalte: "name"
          ("teamnr" ist der Primärschlüssel)

          Beispielzeilen:
          1, Arminia Bielefeld
          2, Werder Bremen


          Wie gesagt soll durch eine Abfrage der Name des Heimteams und der Name des Gastteams in einer Zeile, also

          Arminia Bielefeld Werder Bremen

          ausgegeben werden. Analog zum Code aus Klaus' obigen Beitrag habe ich folgende "SELECT"-Anweisung getestet (es geht nur ums Prinzip, daher "ungefilterte" Daten):

          "SELECT heimteam.name AS Heimmannschaft, gastteam.name AS Gastmannschaft
          FROM spiele
          JOIN teams AS heimteam ON heimteam.teamnr = spiele.heimnr
          JOIN teams AS gastteam ON gastteam.teamnr = spiele.gastnr;"

          Daraufhin erscheint beim mysqladmin folgende Fehlermeldung:

          "You have an error in your SQL syntax near 'ON heimteam.teamnr = spiele.heimnr
          JOIN teams AS gastteam ON gastteam.teamnr =' at line 3"

          Was ist da los? Hat das irgendwas mit den Primärschlüsseln zu tun?