SQL-Abfrage fuer Spielpaarungen und Tabelle

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • SQL-Abfrage fuer Spielpaarungen und Tabelle

    Halloechen,

    Mein Ziel war es eigentlich eine Webseite fuer die WM zu basteln, mit der ich Ergebnisse von Spielpaarungen eintragen kann, und sich die Tabellen dann automatisch ergeben. Gleichzeitig war das Ziel, dass Mitspieler Tips abgeben koennen, die dann gegen die wirklichen Ergebnisse verglichen werden. (Ich glaube zwar nicht dass ich noch genuegen Zeit habe, um bis zur WM fertig zu werden, allerdings hab ich schon so viel Zeit reingesteckt, dass ich verstehen moechte wie man es umsetzen kann.)

    Ich habe zwei Tabellen:

    TEAMS mit
    MannschaftID Mannschaftname
    1____________Brasilien
    2____________Frankreich
    3____________Schweden
    ...

    Spiele mit
    SpielID TeamA TeamB ToreA ToreB
    1______1_____2______1____0
    2 ______1____ 3______0____1
    3______ 2____ 1______1____1

    Folgende Schwierigkeiten habe ich:
    a) Wie kann ich eine Abfrage gestalten die zeigt:

    Spiel TeamA TeamB ToreA ToreB
    1____Brasilien__Frankreich__1___ 0
    2____Brasilien__ Schweden__0___1

    Die Schwierigkeit liegt darin, dass die Tabelle Spiele zwei Spalten hat die den Mannschaftsnamen aus der Tabelle Teams zieht.
    (Mit select... where TeamA=MannschaftID and TeamB=MannschaftID geht es ja nicht. Und wie in diesem Fall eine Subselect aussehen muesste weiss ich nicht.

    b) Wie kann die Abfrage aussehen, die mir eine Tabelle erstellt?
    No Team Torefuer Toregegen Punkte
    1__Brasilien__2____0________6
    2__Frankreich_1___1________3
    ...


    Was ich bereits geschaft habe ist:
    -Eine Tipliste gegen die Spielpaarungen zu vergleichen und punkte fuer die Mitspieler zu vergeben.
    -Zu sortieren welcher Mitspieler die meisten Punkte hat und dafuer ein Ranking aufzubauen. (Wer sich dafuer Interressiert kann sich melden).
    -Die Ergebnisse in den Tabellen "Tipliste" und "Spielen" mit PHP aktualisiert werden koennen.

    Fuer a) und b) bekomm ich aber wirklich graue Haare. Ich bekomms nicht hin und hoffe auf Eure Unterstuetzung.
    Gruss
    Daniel

  • #2
    Hallo Danusus
    Zu a)
    select [...]
    from spiele a
    left join teams b on a.TeamA=b.MannschaftID
    left join teams c on [...]

    Zu b)
    JOIN, SUM & GROUP BY

    Kommentar


    • #3
      Hallo Fuser,

      Vielen Dank fuer deine Antwort. Ich hab es versucht, mir ist allerdings nach einigem Probieren aufgefallen,dass ich vor der gleichen Schwierigkeit stehe.

      Zu a)
      Meine Query ist:
      Select * from spiele a innerjoin teams b on a.TeamA=b.TeamID innerjoin teams c on a.TeamB=c.TeamID.

      Mit dem PHP code baue ich die Tabelle:
      spieleID TeamA TeamB ToreA ToreB Teamname

      Diese zeigt dann (Beispiel team12 ist Brasilien, team13 ist Frankreich):

      Spiel TeamA TeamB ToreA ToreB Teamname
      1____12_____13 ____1____ 0___Brasilien

      (Teamname kommt aus der Tabelle teams und zeigt mit obiger Query den Teamnamen fuer Team12.Mit der obigen Query kann ich also Brasilien anzeigen.
      Wie schaffe ich es aber den Namen beider Teams anzuzeigen? Dass also die Tabelle so aussieht:
      Spiel TeamA TeamB ToreA ToreB TeamnameA__TeamnameB
      1____12_____13 ____1____ 0___Brasilien_____Frankreich

      Ich nehme an, dass ich die Query irgendwie umschreiben muss, sodass ich TeamnameA und TeamnameB herausbekomme.
      Leider weiss ich nicht wie!?

      Zu b)

      JOIN, SUM & GROUP BY. In diese Richtung habe ich bereits gedacht. Allerdings kann Brasilien ja links und auch rechts stehen. Dass heisst die Query muss beide Spalten pruefen ob 12(Brasilien) drinsteht. Wenn dies der Fall ist muss noch geprueft werden ob links oder rechts mehr Tore gefallen sind. Anhand dessen muss dann Brasilien 1,2 oder 3 Punkte erhalten.
      Kannich da ein bisschen mehr Unterstuetzung bekommen?

      Kommentar


      • #4
        zu a)
        statt SELECT * musst Du die Spalten angeben, z.B.
        b.Mannschaftname as Mannschaft1,
        c.Mannschaftname as Mannschaft2

        Kommentar


        • #5
          Vielen Dank,
          Die Anzeige der Mannschaftsnamen bei den Spielpaarungen hat funktioniert (wie von fuser beschrieben).

          Jetzt steh ich allerdings vor der naechsten Schwierigkeit fuer b) Tabellen aufbau.

          Ich moechte die Tabelle aufbauen, welche sich aus den Spielergebnissen ergibt. Wie beschrieben, kann es fuer die Spiele sein dass z.b. Brasilien auf der rechten, aber auch auf der linken Seite stehen kann.

          Beispiel fuer Spielpaarung:
          Brasilien - Deutschland 1:0
          Portugal - Brasilien 1:1
          ...

          Meine Query sieht so aus:
          select teamname, TeamA,TeamB, sum (ToreA) as d, sum (ToreB) as e from Spiele, teams where TeamA=TeamID group by teamID
          Union
          select teamname, TeamA,TeamB, sum (ToreA) as d, sum (ToreB) as e from Spiele, teams where TeamB=TeamID group by teamID

          Nun erhalte ich:

          Brasilien_____1:0 (Info: Brasilien hat gewonnen - select vor Union)
          Deutschland__0:0 (Info: Deutschl. hatte kein Spiel auf der li.Seite stehend)
          Portugal_____1:1
          Brasilien_____1:1
          Deutschland__1:0 (Info: Deutschland hat verloren - select nach union)
          Portugal_____0:0 (Info: Portugal hatte kein Spiel auf der re.Seite stehend)

          Zur Erklaerug:
          Die oberen 3 Eintraege stammen aus dem Select-teil vor Union (also alle Ergebnisse die das Team auf der linken Seite stehend hatte) , die unteren 3 aus dem Select-teil nach Union (also alle Ergebnisse die das Team auf der rechten Seite stehend hatte). Wenn das Team also kein Spiel hatte (waehrnd es auf der linken Seite stand), dann steht 0:0 als eintrag in der oberen Haelfte der Tabelle.

          Mein Ziel:
          1)Alle Mannschaften nur einmal auffuehren. (Ich habe es mit join, group by, sum... versucht, leider aber nie geschaft.
          2)Die Tore richtig zusammenzaehlen.
          (fuer Brasilien waere es also z.B. 1:0 + 1:1 = 2:1,
          Deutschland 0:0 + 0:1 = 0:1). Wie kann ich das Ergebnis umkehren?
          3)Punkte vergeben wenn Spiel gewonnen.--> In einer ersten Query (ohne Join hab ich es bereits geschaft: if(ToreA>ToreB,3,if(ToreA<ToreB,0,1) as PunkteA____ if(ToreB>ToreA,3,if(ToreB<ToreA,0,1) as PunkteB.

          Selbst wenn Ihr mir vielleicht boese seid, dass Deutschland in meinem Bsp einmal verloren hat und einmal nur Untentschieden, so hoffe ich trotzdem auf Hilfe.
          Wie kann ich 1) und 2)zustande bringen? (Oder gibt es eine andere, einfachere Loesung?)

          Kommentar


          • #6
            *verschrieb* hat fuser schon richtig geantwortet.
            Zuletzt geändert von muh (newbie); 28.05.2006, 19:43.

            Kommentar


            • #7
              Hallo Danusus
              Besser Du gehst von Teams aus und hängst alle Spiele dran statt UNION:

              SELECT
              [...]
              from teams a
              LEFT JOIN spiele b on a.TeamID=b.TeamA OR a.TeamID=b.TeamB

              Jetzt hast Du für jedes Team und jedes von dem Team gespielte Spiel eine Zeile.

              Bei der Spalte "Tore für" und "Tore gegen" musst Du dann mit IF schauen,
              ob das Team in teams in der Tabelle spiele das TeamA oder TeamB ist:
              if(a.TeamID=TeamA,ToreA,ToreB)

              Am besten, zuerst den ganzen JOIN aufbauen.
              Wenn der funktioniert, danach den SUM und GROUP noch einbauen.

              Kommentar


              • #8
                Hallo Fuser,

                Vielen Dank, hat geklappt. (Haette ich alleine wahrscheinlich nicht hinbekommen.) Fuer all die anderen Interessierten hier nochmal die gesamte Query fuer Spiele und Tabellenaufbau.


                SPIELE AUFLISTEN
                SELECT b.teamname,c.teamname,ToreA ,ToreB from tiplist a left join teams b on a.TeamA=b.TeamID left join teams c on a.TeamB=c.TeamID


                TABELLE ZEIGEN:
                select teamID,teamname,
                sum(if(A_ToreA='-',0,1)) as ct,
                sum(if(TeamID=TeamA,ToreA,ToreB)) as Tfor,
                sum(if(TeamID=TeamA,ToreB,ToreA)) as Tag,
                (sum(if(TeamID=TeamA,ToreA,ToreB)))-(sum(if(TeamID=A_TeamA,ToreB,ToreA))) as Tdif,
                sum(if(ToreA='-',0,if(if(TeamID=TeamA,ToreA,ToreB)>if(TeamID=TeamA,ToreB,ToreA),3,if(if(TeamID=TeamA,ToreA,ToreB)<i f(TeamID=TeamA,ToreB,ToreA),0,1)))) as Pts
                from teams a left join tiplist b on a.TeamID=b.TeamA or a.TeamID=b.TeamB
                group by teamID order by PTS desc, Tdif desc, Tfor desc

                (Info: Die Ergebnisse die noch nicht gespielt sind zeigen -:-. Um zu zaehlen wie viele Spiele die Mannschaft gespielt hat, zaehle ich also alle Eintraege, bei denen ToreA nicht "-" zeigt. Punkte duerfen natuerlich auch nur vergeben werden, wenn das Spiel bereits gespielt ist. Ansonsten wuerden alle Spiele die noch nicht gespielt sind (also -:-) einen Punkt an beide Mannschaften vergeben.)

                Nun noch eine Frage:
                Ich wiederhole in der Query staendig if(TeamID=TeamA,ToreA,ToreB) --> as Tfor (Tore fuer das Team) und auch (TeamID=TeamA,ToreB,ToreA)) --> as Tag (Tore gegen das Team).
                Kann ich denn nicht irgendwie Tfor und Tag weiterverwenden?
                Zum Beispiel um die Tordifferenz zu errechnen wuerde ich gerne (Tfor-Tag) as Tdif verwenden. Hier bekomme ich allerdings eine Fehlermeldung.
                Ideen?

                Kommentar


                • #9
                  Hallo Danusus
                  Original geschrieben von Danusus
                  Ich wiederhole in der Query staendig if(TeamID=TeamA,ToreA,ToreB) --> as Tfor (Tore fuer das Team) und auch (TeamID=TeamA,ToreB,ToreA)) --> as Tag (Tore gegen das Team).
                  Kann ich denn nicht irgendwie Tfor und Tag weiterverwenden?
                  IMO geht das leider nicht. Einzige Möglichkeit: Stored Function.
                  Würde ich wegen so was allerdings nicht machen.

                  Kommentar


                  • #10
                    Muss ich eben mit den riesigen Query leben...

                    Vielen Dank nochmal fuer deine Hilfe.

                    Gruss
                    Daniel

                    Kommentar

                    Lädt...
                    X