Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

TOP 5: SELECT mit Subtraktion

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von MrMahi, 16 Oktober 2012.

  1. MrMahi

    MrMahi Benutzer

    Hallo,

    ich habe ein Problem, versuche das mal zu erläutern.

    Ich habe für 2 Spieler eine kleine Datenbank (Thomas & Jens, zocken FIFA).

    In einem SELECT ermittel ich die 5 TOPTEAMS für z.B. Thomas:

    Code:
    SELECT team_thomas, COUNT(team_thomas) AS teamthomas, img_url
    FROM fifa, teams
    WHERE score_thomas > score_jens
    AND fifa.team_thomas = teams.teamname
    GROUP BY team_thomas
    ORDER BY teamthomas DESC
    LIMIT 5
    
    Das klappt auch alles einwandfrei.

    Jetzt möchte ich aber die TOP5 so berechnen das wenn die gleiche Mannschaft öfters verloren als gewonnen hat, Sie nicht mehr in der Tabelle erscheint.
    Momentan ist das so das die Top-Mannschaft auf die Flop-Mannschaft sein kann.
    Das macht ja keinen Sinn.

    Ich komme aber nicht weiter.

    Wollte es so machen

    ...WHERE (score_thomas > score_jens) - (score_jens > score_thomas)

    das geht aber nicht.

    Kann mir bitte jemand sagen wie es geht?

    Beste Grüße,
    Jens
     
  2. Tommi

    Tommi Datenbank-Guru

    Hallo Jens,

    versuchs mal mit folgender WHERE-Klausel:

    Code:
    ...
    WHERE (score_thomas - score_jens) > 0
    Hier wird dann nur der Score-Gleichstand nicht beachtet, was aber mit einem >= auch noch ganz leicht zu ändern wäre.

    Viele Grüße,
    Tommi
     
  3. MrMahi

    MrMahi Benutzer

    Hallo Tommi,

    vielen Dank schon mal. Sah für mich super aus der Ansatz.
    Zu meiner Überraschung hat sich dadurch gar nichts verändert? (Hätt ich nicht gedacht).
    Andere Ideen?

    Beste Grüße,
    Jens
     
  4. MrMahi

    MrMahi Benutzer

    Also, es bleibt beim Problem.
    Bsp. 5 mal mit schalke gewonnen und 9 mal verloren. Trotzdem ist es unter den TOP5 Teams.
     
  5. ukulele

    ukulele Datenbank-Guru

    Du musst die Abfrage schon etwas umbauen um Siege miteinander zu verrechnen, da fallen mir spontan mehrere Möglichkeiten ein. Zwei Tabellen per UNION ALL (hoffentlich bei MySQL möglich) zusammen als Subselect scheint mir schnell und komfortabel:
    Code:
    SELECT    team_thomas,
            img_url,
            sum(win_thomas) AS win_thomas,
            sum(win_jens) AS win_jens
    FROM    (    SELECT    team_thomas,
                        img_url,
                        1 AS win_thomas,
                        0 AS win_jens
                FROM    fifa,
                        teams
                WHERE    score_thomas > score_jens
                AND        fifa.team_thomas = teams.teamname
                UNION ALL
                SELECT    team_thomas,
                        img_url,
                        0 AS win_thomas,
                        1 AS win_jens
                FROM    fifa,
                        teams
                WHERE    score_thomas < score_jens
                AND        fifa.team_thomas = teams.teamname ) hilfstabelle
    WHERE    sum(win_thomas) > sum(win_jens)
    GROUP BY team_thomas
    ORDER BY teamthomas DESC
    LIMIT 5
     
    MrMahi und Walter gefällt das.
  6. MrMahi

    MrMahi Benutzer

    Danke Dir. Das ist natürlich nen Brett ;)
    Momentan motzt die Ausgabe: " Every derived table must have its own alias".
    Ich stelle das noch mal nen bißchen um.
    Hätte gedacht so was kann man mit kürzerer Synatx abhandeln.

    1000 Dank.
     
  7. ukulele

    ukulele Datenbank-Guru

    Du kannst auch per CASE Schleife die Siege der einzelnen Spieler als Spalte ausgeben, du musst aber so wie ich das im Moment sehe in jedem Fall einen Subselect nutzen denn du kannst nicht direkt Gruppieren. Das ist aber alles kein Hexenwerk und relativ harmlos.
     
    MrMahi gefällt das.
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden