MySQL Suche nach Max Value in einer Tabelle

Dieses Thema MySQL - Suche nach Max Value in einer Tabelle im Forum "Datenbankprogrammierung" wurde erstellt von Hades85, 10. Jan. 2017.

Thema: Suche nach Max Value in einer Tabelle Hallo zusammen, die Überschrift ist etwas simpler als es mein Problem darstellt....

  1. Hallo zusammen,
    die Überschrift ist etwas simpler als es mein Problem darstellt.

    Code (Text):
    ID-----playerID-----nationID-----victories
    1           1            1            4
    2           1            2            0
    3           1            3            2
    4           2            1            1
    5           2            2            7
    6           2            3            0
     
    Code (Text):
    SELECT *, MAX(`victories`) as `testMax` FROM `nation_stats` GROUP BY `nationID` ORDER BY MAX(`victories`) DESC
    Wenn ich das richtig sehe gibt mir diese Abfrage zwar die max werte für jede nationID korrekt heraus aber ich kann leider nicht einsehen welche playerID dahinter steckt, zurzeit zeigt er mir bei genau dieser abfrage nur playerID 1 an.

    Ziel ist es aber zu ermitteln welcher player bei jeder nationID den höchsten victory wert besitzt.
     
  2. Vielleicht hilft dir das Java-Tutorial weiter. Hier klicken --> (Klick)
  3. stg
    stg
    Zuerst, wie du es auch schon gemacht hast, fragst du die maximale Anzahl der Siege je Nation ab (mit Max und Group By). Danach joinst du das Ergebnis nocheinmal auf die ursprüngliche Tabelle, um die fehlendenen Werte zu erhalten.
     
    Hades85 gefällt das.
  4. Code (Text):
    select * from nation_stats where victories =
    (select max(victories) from nations_stats)
     
    Hades85 gefällt das.
  5. Meines Wissens musst du alle Felder gruppieren, die du im Select abfrägst.
    Geht evtl. folgendes?
    Code (Text):
    SELECT ID, MAX(`victories`) as `testMax` FROM `nation_stats` GROUP BY `nationID`,`ID` ORDER BY MAX(`victories`) DESC
    Ein Select * ist generell schlecht.
     
  6. stg
    stg
    Das liefert nicht das gewünschte Ergebnis.

    Nein. Eine Gruppierung nach ID macht die Abfrage recht sinnlos.

    Was zu tun ist habe ich ja im ersten Post schon geschrieben. Lasst den TE doch erstmal antworten :)
     
  7. Code (Text):
    select * from nation_stats where victories =
    (select max(victories) from nations_stats)
    Der spuckt mir leider nur das Ergebnis der jenigen SpielerID mit dem höchsten Wert, in meinem Fall waren dass zwei SpielerIDs mit den selben victory Werten.

    Den Versuch nach dem Result ein Join hinzubekommen, scheiterte leider kläglich.

    Muss ich vor dem Join die selbe Tabelle mit sich selber joinen. Also mit dem Muster
    Code (Text):
    SELECT
        c1.city, c1.customerName, c2.customerName
    FROM
        customers c1
            INNER JOIN
        customers c2 ON c1.city = c2.city
            AND c1.customername <> c2.customerName
    ORDER BY c1.city;
    Ich muss leider zugeben, dass meine Kentnisse in SQL sehr rudimentär aufgestellt sind.
     
  8. stg
    stg
    Dann nochmal ausführlich:

    Zuerst fragst du die maximale Anzahl an Siegen je Nation ab:
    Code (Text):
    select NATIONID, MAX(VICTORIES) FROM NATION_STATS GROUP BY NATIONID
    Als Resultat erhälst du
    Code (Text):

      NATIONID MAX(VICTORIES)
    ---------- --------------
             1              4
             2              7
             3              2
     
    Dann der JOIN auf die ursprüngliche Tabelle, um auch die fehlenden Informationen zu erhalten:
    Code (Text):

    SELECT a.NATIONID, a.VICTORIES, b.PLAYERID, b.ID
    FROM (
        SELECT NATIONID, MAX(VICTORIES) AS VICTORIES FROM NATION_STATS GROUP BY NATIONID
    ) a
    INNER JOIN NATION_STATS b
    ON a.NATIONID = b.NATIONID AND a.VICTORIES = b.VICTORIES
     
    Dann bekommst du:
    Code (Text):

      NATIONID  VICTORIES   PLAYERID         ID
    ---------- ---------- ---------- ----------
             1          4          1          1
             3          2          1          3
             2          7          2          5
     
     
    Hades85 gefällt das.
  9. Vielen Dank für deine Mühen! Hat funktioniert, habe jetzt weitere joins vorgenommen um die Namen der nationIDs und playerIDs hinzuzufügen.

    Andere Frage, könnte man noch erzwingen maximal nur einen Eintrag pro nationID zu zeigen, der den höchsten Wert besitzt? Zur Zeit könnte pro nationID auch mehrere playerID angezeigt werden, sollten die playerIDs ebenso viele victories haben.
     
  10. Schau dir jetzt hier den Kurs an und lernen Java zu programmieren: --> Hier klicken, um mehr zu erfahren (Klick)