no4: SELECT-Abfrage

Hallo zusammen!

Ich habe folgende Tabelle mit den Spalten id,team1,team2,tore1,tore2

Mit

SELECT team1,sum(if (tore1>tore2,3,if (tore1=tore2,1,0))) FROM spiele GROUP BY team1

erhalte ich alle Punkte, die ein Team bei Spielen erreicht hat, bei denen das Team an erster Stelle steht.

Analog geht das auch, wenn das Team an zweiter Stelle steht:

SELECT team2,sum(if (tore2>tore1,3,if (tore2=tore1,1,0))) FROM spiele GROUP BY team2

Klar, kann man jetzt die Ergebnisse der Abfragen einfach zusammenzählen.

Aber reicht auch eine Abfrage? Und wenn ja, wie müsste die aussehen?

Viele Grüße
no4

  1. moin,

    Aber reicht auch eine Abfrage? Und wenn ja, wie müsste die aussehen?

    klar kann man das, aber was wilst du machen, eine Tabelle aufbauen?

    Ilja

    1. Wir haben seit längerem ein Tippspiel laufen.

      Und da wird u. a. die Tabelle angezeigt. Da ich hier sowieso auch Heim- und Auswärtstabelle angezeigt habe, habe ich die Gesamttabelle aus den beiden berechnet.

      Aber jetzt so kurz vor der WM bin ich auf die Ewige Tabelle gestoßen.
      Und bei einem WM-Spiel ist es ja bedeutungslos, wer zuerst genannt wird.
      Ich hab hier also kein Heim- und Auswärtstabelle, sondern zwei Tabellen aus willkürlich ausgwählten Spielen.

      Im Prinzip gehts mir darum, mehr von MySQL zu verstehen.

      Grüße no4

      1. moin,

        Im Prinzip gehts mir darum, mehr von MySQL zu verstehen.

        suche mal im archiv, ich hatte in mysql schon mal eine abfrage gemacht, wie sich eine komplette tabelle berechnen läßt.

        Ilja

  2. Hallo,

    SELECT team1,sum(if (tore1>tore2,3,if (tore1=tore2,1,0))) FROM spiele GROUP BY team1

    Analog geht das auch, wenn das Team an zweiter Stelle steht:

    SELECT team2,sum(if (tore2>tore1,3,if (tore2=tore1,1,0))) FROM spiele GROUP BY team2

    Aber reicht auch eine Abfrage? Und wenn ja, wie müsste die aussehen?

    1. UNION ALL der beiden Abfragen

    -- Punkte aus den Heimspielen  
    SELECT  
        team1 team,  
        SUM(IF(tore1 > tore2, 3, IF(tore1 = tore2), 1, 0))) punkte  
    FROM  
        spiele  
    GROUP BY  
        team1  
    UNION ALL  
    -- Punkte aus den Auswärtsspielen  
    SELECT                -- hier sind keine Spaltenaliasnamen mehr zulässig  
        team2,  
        SUM(IF(tore2 > tore1, 3, IF(tore2 = tore1), 1, 0)))  
    FROM  
        spiele  
    GROUP BY  
        team2
    

    2. summiere die Punktespalte (der Du einen hübschen Spaltennamen verpasst hast) und gruppiere nach der Teamspalte:

    SELECT  
        s.team,  
        SUM(s.punkte) gesamtpunkte   -- hier kannst Du den Aliasnamen, den Du  
                                     -- im ersten Teil der UNION festgelegt hast,  
                                     -- verwenden.  
    FROM (  
        SELECT  
            team1 team,  
            SUM(IF(tore1 > tore2, 3, IF(tore1 = tore2), 1, 0))) punkte  
        FROM  
            spiele  
        GROUP BY  
            team1  
        UNION ALL  
        SELECT  
            team2,  
            SUM(IF(tore2 > tore1, 3, IF(tore2 = tore1), 1, 0)))  
        FROM  
            spiele  
        GROUP BY  
            team2  
    ) s    -- der Aliasname für die Unterabfrage ist zwingend erforderlich  
    GROUP BY  
        s.team  
    ORDER BY               -- Zusatz von mir, hättest Du auch selbst hinbekommen  
        SUM(s.punkte) DESC -- üblicherweise sind Fußballtabellen nach  
                           -- erzielten Punkten absteigend sortiert :-)  
                           -- in MySQL wäre auch ORDER BY gesamtpunkte erlaubt,  
                           -- in Standard-SQL nicht.  
    
    

    Da solche Tabellen üblicherweise nicht besonders umfangreich sind, machte ich mir über Performance wenig Gedanken :-)

    Freundliche Grüße

    Vinzenz

    1. Hai!

      UNION ALL ist bisher an mir vorbeigegangen.

      Werde ich mir mal anschauen.

      Danke schon mal

      Grüße
      Jochen