MySQL Suche nach Max Value in einer Tabelle

DefconDev

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

Code:
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:
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.
 
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.
 
Meines Wissens musst du alle Felder gruppieren, die du im Select abfrägst.
Geht evtl. folgendes?
Code:
SELECT ID, MAX(`victories`) as `testMax` FROM `nation_stats` GROUP BY `nationID`,`ID` ORDER BY MAX(`victories`) DESC
Ein Select * ist generell schlecht.
 
Code:
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:
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.
 
Dann nochmal ausführlich:

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

Als Resultat erhälst du
Code:
  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:
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:
  NATIONID  VICTORIES   PLAYERID         ID
---------- ---------- ---------- ----------
         1          4          1          1
         3          2          1          3
         2          7          2          5
 
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.
 

Neue Themen


Zurück
Oben