Sporttabelle

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

  • Sporttabelle

    Schönen Tag !

    Erstmal ein herzliches Hallo an alle, bin neu hier und hoffe, dass ich
    euch nicht allzu viel eurer Zeit berauben werde mit meinen Fragen !

    Ich bin aktuell dabei mir mit Hilfe von PHP und MySQL eine Sporttabelle
    anhand von Spielergebnissen aus der MySQL Tabelle ausgeben zu
    lassen, doch der MySQL-Bereich bereitet mir da leider noch recht große
    Schwierigkeiten.

    Zunächst einmal mein Datenbankaufbau:
    ID - TeamH - TeamA - ToreH - ToreA
    H = Heim & A = Auswärts nur für das Verständnis ... hab natürlich
    auch noch weitere Spalten wie Datum etc., aber für den grundlegenden
    Aufbau der Tabelle ja völlig irrelevant.

    Nun habe ich also beispielsweise zwei Enträge
    1 - Buschhausen - Buxtehude - 2 - 0
    2 - Buschhausen - Karlsruhe - 0 - 5

    Code:
    Select ID, TeamH, TeamA, ToreH, ToreA
    Sum(IF (Ergebnis.ToreH > Ergebnis.ToreA, 3, 0)) as Punkte
    Sum(IF (Ergebnis.ToreH = Ergebnis.ToreA, 1, 1)) as Punkte
    Sum(IF (Ergebnis.ToreH < Ergebnis.ToreA, 0, 3)) as Punkte
    From Ergebnis Group by Team(?) Order by Punkte
    Ich habe jetzt bewusst die MySQL Syntax außen vor gelassen, da
    ich zunächst mal zeigen wollte was ich bisher prinzipiell machen will.
    Nur jetzt weiß ich leider auch nicht weiter, wie ich das MySQL-mäßig
    so mache, damit ich nachher auch wirklich die Tabelle rausbekomme,
    denn so habe ich ja "Team(?)", dass es ja z.B. gar nicht gibt.

    Also ihr seht mir fehlt da leider noch viel das Verständnis für den
    Umgang mit "weiterführendem" MySQL, denn bisher hab ich nur
    Standard-Abfragen für Statistiken, News etc. durchgeführt, aber mit
    diesen Mitteln komme ich hier leider nicht weiter und das Arbeiten
    mit SubSelects, Self-Joins oder Union (Falls man davon was braucht,
    wovon ich ausgehe).

    Naja, würde mich jedenfalls sehr freuen wenn mir jemand dabei
    helfen könnte, wie ich diese MySQL Abfrage gestalten muss, denn
    bisher steh ich ehrlich gesagt auf dem Schlauch ...

    Ich wünsche euch noch einen schönen Feiertag und schonmal
    Vielen Dank für jeden Beitrag!

  • #2
    die struktur deiner tabelle ist etwas unpraktisch gewählt

    an deiner stelle würde ich spielpaare splitten, so dass du in der datenbank in deinem beispiel folgendes hättest:

    spiel - team - tore - heim
    1 - Buschhausen - 2 - 1
    1 - Buxtehude - 0 - 0
    2 - Buschhausen - 0 - 1
    2 - Karlsruhe - 5 - 0


    darauf aufbauend sollte sich die abfrage wesentlich leichter gestalten lassen...

    greetz, high
    Good programming is 40% experience, 20% skill, 20% RTFM, 15% caffeine, and 5% attention to detail.
    When everything else fails, manipulate the data...
    Beschriftungen / Großformatdruck / Werbemittel

    Kommentar


    • #3
      Du willst sicher nicht nur die Tabelle einer Saison verarbeiten, sondern mehrere Spielzeiten.
      Ausserdem möchtest du bestimmt die Tabelle jedes Spieltags haben.
      Weiterhin gibt es mehrere Ligen usw usw.

      Deine (MYSQL)-Tabelle könnte so aussehen
      Code:
      id_liga         PK
      id_saison    PK
      spieltag       PK
      spielnr        PK
      id_heim      FK
      id_gast       FK
      tore_heim
      tore_gast
      Die Attribute, die mit "id" beginnen, verweisen auf andere Tabellen.
      PK = Primary Key. FK = Foreign Key.

      Punkte werden berechnet - gehören also nicht in die Datenbank.

      Deine Berechnung läuft dann wie folgt:
      Du holst dir die Datensätze einzeln aus der Datenbank und berechnest Torverhältnis und Punkte jeder Mannschaft.
      Her mittie Abbeit!

      Kommentar


      • #4
        @kratzbaum

        und schon hat er in deiner tabelle wieder das selbe Logik-Problem wie zuvor auch... TEAM mus eindeutig sein... basta... und net team_heim team_gast... sonst hast du wieder das selbe problem in der ORDER BY klausel...

        die punkte gehören natürlich nicht in die tabelle... sind sie ja auch nie vorgesehen gewesen, aber die werden bereits während der abfrage berechnet, weils schneller geht, als den ganzen simsch hinterher in PHP nochmal zu durchlaufen und da ggf. dann auch noch den parser mit variablen variablen zu quälen...

        dass die tables noch durch weitere angaben ergänzt werden können, versteht sich von selbst...

        insofern... erst lesen, dann denken, dann posten...

        greetz, high
        Good programming is 40% experience, 20% skill, 20% RTFM, 15% caffeine, and 5% attention to detail.
        When everything else fails, manipulate the data...
        Beschriftungen / Großformatdruck / Werbemittel

        Kommentar


        • #5
          Danke für die Hilfe schonmal, ich glaub soweit hab ich schon
          einen guten Ansatz dafür !

          Desweiteren würd ich allerdings noch eine Frage stellen,
          wenn ich darf: Hab mich nämlich währenddessen mit etwas
          anderes beschäftigt, da ich ja hier nicht weiterkam ...

          Code:
          SUM(
          If(x.TeamID = y.ID AND x.LeagueID = 1, If(x.HGoals > x.AGoals, 10,
          If(x.HGoals < x.AGoals, 3, 7)))) as Wertung
          Ich erhalte an dieser Stelle einen Syntax Fehler in einem MySQL
          Statement ... der Rest funktioniert (hab mal diesen Teil rausgenommen
          und nur den Rest laufen lassen - läuft prima)

          Wisst ihr vielleicht welchen Syntaxverstoß ich hier erzwungen habe?
          Der Fehler ist übrigens Nummer 1064.

          Schonmal lieben Dank und einen schönen Sonntag!

          Kommentar


          • #6
            ich bin nicht sicher...

            würde aber tippen: bei dem ersten if fehlt das alternativergebnis...

            ansonsten kann ich nichts entdecken...
            Zuletzt geändert von highrise; 10.06.2007, 05:31.
            Good programming is 40% experience, 20% skill, 20% RTFM, 15% caffeine, and 5% attention to detail.
            When everything else fails, manipulate the data...
            Beschriftungen / Großformatdruck / Werbemittel

            Kommentar


            • #7
              Code:
              SUM(
              // Wenn das Team aus der SpieleDB mit dem Team aus der VereinsDB
              übereinstimmt und es sich um die Liga mit der ID 1 handelt
              If(x.TeamID = y.ID AND x.LeagueID = 1, 
              
              // Wenn Heimteam mehr Tore geschossen hat, erhalten sie 10 Wertungspunkte
              If(x.HGoals > x.AGoals, 10,
              
              // Wenn Heimteam weniger Tore geschossen hat, erhalten sie nur 3 Wertungspunkte
              If(x.HGoals < x.AGoals, 3,
              
              // Ansonsten (Unentschieden-Fall) gibt es sieben Punkte
               7)))) as Wertung
              Ist die letzte 7 dann nicht so ein Alternativereignis für das If?

              Kommentar


              • #8
                if erwartet drei diskrete statements...

                für das zweite und das dritte if ist das gegeben if (bedingung, statement falls true, statement falls false)

                die 7 gehört zum dritten if

                die logik ist okay, soweit, aber es existiert kein statement für den fall


                x.TeamID = y.ID AND x.LeagueID = 1 == false

                greetz, high
                Good programming is 40% experience, 20% skill, 20% RTFM, 15% caffeine, and 5% attention to detail.
                When everything else fails, manipulate the data...
                Beschriftungen / Großformatdruck / Werbemittel

                Kommentar


                • #9
                  Hmm, ich dachte dies wäre egal, also wenn die If-Bedingung nicht
                  erfüllt ist und es kein anderes Statement gibt, dass dann einfach nichts
                  passiert ....

                  Was würdest du mir denn vorschlagen da noch inwiefern hinzuzufügen?
                  Kann ja auch nur ein BeispielStatement sein nur um zu schauen ob
                  es überhaupt daran liegt ...

                  Kommentar


                  • #10
                    probier mal einfach so:

                    SUM(
                    If(x.TeamID = y.ID AND x.LeagueID = 1, If(x.HGoals > x.AGoals, 10,
                    If(x.HGoals < x.AGoals, 3, 7)),0)) as Wertung

                    means, wenn die initialbedingung vom ersten if nicht erfüllt ist, dann 0 Punkte

                    alternativ könntest du das erste if weglassen und stattdessen das ganze in eine WHERE klausel packen.. also in der art:

                    SUM(
                    If(x.HGoals > x.AGoals, 10,
                    If(x.HGoals < x.AGoals, 3, 7))) as Wertung WHERE x.TeamID = y.ID AND x.LeagueID = 1

                    greetz, high
                    Zuletzt geändert von highrise; 10.06.2007, 10:57.
                    Good programming is 40% experience, 20% skill, 20% RTFM, 15% caffeine, and 5% attention to detail.
                    When everything else fails, manipulate the data...
                    Beschriftungen / Großformatdruck / Werbemittel

                    Kommentar


                    • #11
                      Ersteres funktioniert perfekt Lag also doch wie du sagtest daran,
                      dass das erste If Statement wissen muss, was es machen soll, wenn
                      es False ist - Vielen Dank !

                      Kommentar


                      • #12
                        Hallo nochmal und entschuldigt bitte die Störung, aber ich wollte
                        noch eine Kleinigkeit bezüglich MySQL nachfragen ... ist es möglich
                        mit gerade in MySQL berechneten Werten weiterzurechnen?
                        Ich bekomme nämlich immer die Meldung "Unknown colum XX in field list"

                        Es geht nämlich um folgendes ...

                        Code:
                        SELECT v.Nation, v.ID, COUNT( v.Nation ) AS Anzahl, 
                        SUM(
                        IF ( plan.HID = v.ID AND plan.LigaID =1,
                        IF ( plan.HTore > plan.ATore, 500,
                        IF ( plan.HTore < plan.ATore, 75, 200) ) ,
                        
                        IF ( plan.AID = v.ID AND plan.LigaID =1,
                        IF ( plan.ATore > plan.HTore, 500,
                        IF ( plan.ATore < plan.HTore, 75, 200 ) ) , 0 ) )
                        ) AS Wertung
                        FROM WC_Spiele plan
                        JOIN WC_Nationen v ON plan.AID = v.ID OR plan.HID = v.ID
                        WHERE v.ID = plan.HID OR v.ID = plan.AID
                        GROUP BY Nation, ID
                        /* ORDER BY Points DESC */
                        Nun habe ich in "Wertung" eine Zahl stehen und in "Anzahl"
                        ebenso. Was ich nun machen wollen würde ist allerdings Wertung
                        durch Anzahl zu dividieren (also SUM(Wertung/Anzahl) as Points) und
                        dann danach in der ORDER BY Klausel danach sortieren zu lassen.
                        Aber da erhalte ich wie gesagt immer diese Fehlermeldung und wie
                        ich solche Einträge in PHP sortieren sollte, weiß ich ehrlich gesagt
                        leider auch nicht ... (falls es nicht über MySQL gehen sollte)

                        Kommentar


                        • #13
                          Hallo,

                          entschuldigt bitte den Doppelpost, aber gibt es niemanden der
                          mir dabei vielleicht helfen könnte?

                          Kommentar


                          • #14
                            Zeig mal die genaue Query, wie sie abgesetzt wird, und die genaue Fehlermeldung. Oder ist "xx" der Spaltenname?

                            Kommentar


                            • #15
                              Erstmal Danke für die Antwort.

                              Also erstmal das Grundgerüst bzw. die Idee ...


                              Code:
                              SELECT v.Nation, v.ID, COUNT( v.Nation ) AS Anzahl, 
                              SUM(
                              IF ( plan.HID = v.ID AND plan.LigaID =1,
                              IF ( plan.HTore > plan.ATore, 500,
                              IF ( plan.HTore < plan.ATore, 75, 200) ) ,
                              
                              IF ( plan.AID = v.ID AND plan.LigaID =1,
                              IF ( plan.ATore > plan.HTore, 500,
                              IF ( plan.ATore < plan.HTore, 75, 200 ) ) , 0 ) )
                              ) AS Wertung
                              FROM WC_Spiele plan
                              JOIN WC_Nationen v ON plan.AID = v.ID
                              OR plan.HID = v.ID
                              WHERE v.ID = plan.HID
                              OR v.ID = plan.AID
                              GROUP BY Nation, ID
                              Nun habe ich z.B. folgendes
                              ID = 3 / Anzahl = 2 / Wertung = 1100

                              Nun geht es mir nur darum, die Wertung durch die Anzahl
                              zu dividieren. Dazu hab ich folgendes nun gemacht:

                              Code:
                              SELECT v.Nation, v.ID,
                              SUM((
                              IF ( plan.HID = v.ID AND plan.LigaID =1,
                              IF ( plan.HTore > plan.ATore, 500,
                              IF ( plan.HTore < plan.ATore, 75, 200) ) ,
                              
                              IF ( plan.AID = v.ID AND plan.LigaID =1,
                              IF ( plan.ATore > plan.HTore, 500,
                              IF ( plan.ATore < plan.HTore, 75, 200 ) ) , 0 ) ) )
                              
                              /COUNT( v.Nation )) as Durchschnitt
                              
                              FROM WC_Spiele plan
                              JOIN WC_Nationen v ON plan.AID = v.ID OR plan.HID = v.ID
                              WHERE v.ID = plan.HID OR v.ID = plan.AID
                              GROUP BY Nation, ID // Schon getestet auch mit v.Nation und v.ID - Gleicher Fehler
                              ORDER BY Durchschnitt DESC
                              Seitdem ich allerdings das so umgestellt habe, gibt es nun die
                              Meldung > #1111 - Invalid use of group function
                              Und es liegt 100% an der Division, denn wenn ich die ganze Divisionsgeschichte
                              entferne funktioniert es.

                              Kommentar

                              Lädt...
                              X