MySQL ranking automatisch sortieren



  • nman schrieb:

    IBV schrieb:

    Außerdem kannst du nur nach dem sortieren, was du auch selektiert hast!

    Das stimmt nicht.

    Hab das mit Gruppieren verwechselt. 🙂



  • cl90 schrieb:

    Wie funktioniert denn dieses SQL Fiddle?

    So: http://sqlfiddle.com/#!2/4654e5

    edit: URL wird nicht sauber geparsed.



  • ja aber das bringt mich nicht weiter. Ich kann auch SQL befehle bei phpMyAdmin eingeben und ausführen lassen.
    Jetzt kann ich nur woanders hunderte Versuche eintippen die alle nicht funktionieren.

    Also:

    SELECT teamID, count(winnerID) as wins FROM 
    teamlist, teambattlelist GROUP by teamID
    

    Das gibt jetzt eine liste aller TeamIDs und 7 aus. (weil einfach nur die 7 winner einträge gezählt wurden...)

    SELECT teamID, count(winnerID) as wins 
    FROM teamlist, teambattlelist 
    GROUP by teamID WHERE teamID = winnerID
    

    ist falsche syntax. Das WHERE darf da nicht stehen...

    Edit:
    rangetastet. So funktionierts:

    SELECT teamID, count(winnerID) as wins 
    FROM teamlist, teambattlelist 
    Where teamID = winnerID AND teambattlelist.tournID = "3" 
    GROUP by teamID 
    ORDER BY wins DESC
    

    Danke für die Hilfe

    Edit3:
    Wenn ich vorhabe noch mehr informationen zu erhalten, muss ich dann neue Querys machen?
    Ich würde z.b. jetzt auch gerne die verlohrenen Spiele zählen lassen.



  • 3 ist kein String, also brauchst du nicht auf "3" checken und der Join ist überflüssig, den brauchst du hier gar nicht:

    SELECT winnerID, count(winnerID) as wins
    FROM teambattlelist
    WHERE tournID = 2
    GROUP by winnerID
    ORDER BY wins DESC;
    


  • Ok.

    Wie gesagt, wenn ich jetzt weitere elemente haben möchte, muss ich dann eine neue Query machen? Oder wie könnte ich jetzt z.b. Zusätzlich nach verlohrenen Spielen suchen?

    mir fällt auch gerade auf, dass ohne einen Joint immer nur die Teams gelistet werden die mindestens einmal gewonnen werden. Wie bekomme ich denn jetzt
    eine vollständige liste?



  • cl90 schrieb:

    Wie gesagt, wenn ich jetzt weitere elemente haben möchte, muss ich dann eine neue Query machen?

    Die allermeisten Sachen kannst du vmtl. im selben Query machen.

    mir fällt auch gerade auf, dass ohne einen Joint immer nur die Teams gelistet werden die mindestens einmal gewonnen werden. Wie bekomme ich denn jetzt
    eine vollständige liste?

    Die Dinger heißen Joins; Joints helfen hier vmtl. nicht sehr viel weiter.

    Wenn du für jedes Team die Counts haben möchtest (auch für Teams mit 0 Siegen), brauchst du einen Join, ja.



  • Aber wie könnte ich die beiden Tabellen joinen?
    Ich habe ja das Problem das die TeamID aus der "teamlist" entweder in der winnerID oder in der loserID stehen kann. Meine Join tabellen haben meistens deutlich mehr Einträge als die ursprungstabellen selbst.

    Edit:
    Ich sehe aktuell keinen weg das mit einer einmaligen Query zu lösen. Liege ich damit falsch?

    Macht in diesem fall ein View sinn? Ich könnte eine view table erstellen die die teamIDs und eine weitere noch leere spalte beinhaltet, welche ich dann in einer zweiten updatequery mit den win counts fülle.



  • Views können die eigentlichen Querys einfacher halten, insofern auch als Anfänger keine schlechte Idee.

    Damit könntest du die Abfrage zB. so irgendwie zusammenbasteln:

    create view wonGames as
      select teamID, count(winnerID) as wonGames
      from teamlist t left outer join teambattlelist b on (t.teamID = b.winnerID)
      group by teamID;
    
    create view lostGames as
      select teamID, count(winnerID) as lostGames
      from teamlist t left outer join teambattlelist b on (t.teamID = b.loserID)
      group by teamID;
    
    select *
    from teamlist natural join wonGames natural join lostGames;
    

    Btw, teamlist und teambattlelist uä. sind ziemlich schlechte Namen.

    Ich würde die Tabellen einfach teams , battles uä. nennen. Die IDs jeweils einfach nur id und wenn du in battles die ID von teams referenzierst, nennst du die dortige Spalte team_id oä.

    Ich würde auch noch Foreign Key Constraints und ein paar Indizes dazupacken.



  • Ok.

    Wie lange bleibt ein View wenn er erstmal erstellt ist?
    Und habe ich das richtig gelesen, dass ein erstelltes View sich vor jeder SELECT abfrage dieses Views neu aktualisiert?
    Das würde bedeuten das ich das Create View nur einmal ausführen muss, bzw. teste ob es da ist, und sonst neu anlege?



  • cl90 schrieb:

    Wie lange bleibt ein View wenn er erstmal erstellt ist?

    Bis du die View wieder löscht.

    Und habe ich das richtig gelesen, dass ein erstelltes View sich vor jeder SELECT abfrage dieses Views neu aktualisiert?

    Eine View ist im Grunde nichts anderes als ein abgespeichertes Select.

    Der Query da oben ist übrigens hässlich; habe gerade gesehen, dass es viel schöner wäre, in den beiden Views keine Joins zu verwenden und den Left Outer Join dann im Select zu machen (NULLs durch 0 ersetzen). Damit sparst du dir zwei unnötige Joins.


Anmelden zum Antworten