Top-3-Liste

Hallo, ich habe eine Tabelle mit folgenden Inhalten

golfspieler = Name des Spielers
schlaege_gesamt = Schläge, die der Spieler für eine Runde benötigt hat.

Ich möchte nun eine Top 3 Liste erhalten, in der die 3 besten Spieller, mit Ihrem jeweils besten Ergebnis angezeigt werden.

Also folgende Inhalte stehen zb. in der Datenbank
----------------------------------------------------------------------------
Fred 15
Fred 16
Fred 21
Bernd 14
Bernd 25
Hugo 16
Hugo 19
Hugo 26
Hugo 12

Als Ergebnis möchte ich folgendes haben
-------------------------------------------------------------
1. Platz Hugo 12
2. Platz Bernd 14
3. Platz Fred 15

Wie kann ich ein solches Ergebnis aus der Datenbank
auslesen, ohne diese mit evtl. unnötigen aufeinanderfolgenden
Abfragen zu sehr auszubremsen.

Kann ich sowas in einem Select-Befehl unterbringen ?

Danke

(Hab ich erwähnt, das ich blutiger Anfänger bind ?! ... Ich bitte dies zu beachten ) :-(
 
Hallo,

folgendes könnte klappen:
Code:
SELECT
	`golfspieler`,
	MIN(`schlaege_gesamt`) AS `bestes_ergebnis`
FROM
	`tabelle`
GROUP BY `golfspieler`
ORDER BY `bestes_ergebnis`

Grüße,
Matthias
 
Super !

Hat klasse geklappt. Die Abfrage lautet nun:

PHP:
$abfrage_player=mysql_query("SELECT golfspieler, MIN(schlaege_gesamt) 
                                              AS bestes_ergebnis 
                                              FROM $tabelle_1 
                                              GROUP BY golfspieler
                                              ORDER BY bestes_ergebnis 
                                              LIMIT 5");

Jetz habe ich nur noch eine kleine Frage, die sich hierbei ergeben hat.

Zu jedem Eintrag eines Ergebnisses wird auch noch Zeitpunkt in der Datenbank
abgespeichert - und zwar im Feld "timecode".

Wenn ich dieses Feld nun in die Abfrage mit einbringe, dann bekomme ich
bei der Ausgabe zwar ein Datum angezeigt, aber NICHT das Datum, das zu dem
niedrigsten Ergebnis passt - sondern irgend ein anderes.

Der nicht funktonierende Code sieht dann so aus:

PHP:
$abfrage_player=mysql_query("SELECT timecode, golfspieler, MIN(schlaege_gesamt) 
                                              AS bestes_ergebnis 
                                              FROM $tabelle_1 
                                              GROUP BY golfspieler
                                              ORDER BY bestes_ergebnis 
                                              LIMIT 5");

Kann ich das passende Datum in dieser Abfrage noch herausbekommen ?!

Vielen Dank schonmal vorab !!
 
Das Datum ist schon das richtige welches in der timecode Spalte zu dem jeweiligen Datensatz steht. Ich schätze du formatierst es nur falsch, wie verarbeitest du denn das Ergebnis (Quellcode) ?

[EDIT]
Hab eben erst gesehen das es mehrere Datensätze für eine Person sind ;)
Welches Datum willst du denn haben, du bekommst ja nur einen Datensatz zurück es gibt aber n Datumseinträge!

[EDIT2]
Die Hitze ist Schuld, die lässt einem nicht klar denken *g*
Du willst natürlich den mit den wenigsten Schlägen, .. der sollte eigentlich zurückgegeben werden oder? Nun gut da weiß ich dann auch net weiter :p
 
Zuletzt bearbeitet:
Hehe .... :-)

Die Hitze ist echt fies momentan

:)

Also im Prinzip möchte ich das älteste Datum, an dem der Spieler dieses Ergebnis zum ersten Mal gespielt hat.

Somit habe ich bei Ergebnisgleichheit von zwei Spielern die Möglichkeit, den Spieler der dieses als erster erreicht hat, auch in der Rangfolge zu bevorzugen.

Werde morgen den aktuellen Code nochmal posten - jetz muss ich aber erstmal ins Bett - war ein harter Tag - Vielen Dank aber vorab schonmal für die Mühe
 
Hallo,

hier gibt es mehrere Vorgehensweisen:

  • Mit Subselect (mit MySQL >= 4.1.x):
Code:
SELECT
  `g1`.`golfspieler`,
  `g1`.`schlaege_gesamt` AS `bestes_ergebnis`,
  `g1`.`timecode`
FROM
  `golfer` `g1`
WHERE `g1`.`schlaege_gesamt` =
  (SELECT MIN(`schlaege_gesamt`)
   FROM `golfer` `g2`
   WHERE `g1`.`golfspieler` = `g2`.`golfspieler`
  )
ORDER BY `bestes_ergebnis`, `timecode`
  • Mit Selfjoin:
Code:
SELECT
  `g1`.`golfspieler`,
  `g1`.`schlaege_gesamt` AS `bestes_ergebnis`,
  `g1`.`timecode`
FROM
  `golfer` `g1`
LEFT JOIN
  `golfer` `g2` ON
    (`g1`.`golfspieler` = `g2`.`golfspieler` AND
     `g1`.`schlaege_gesamt` > `g2`.`schlaege_gesamt`)
WHERE `g2`.`golfspieler` IS NULL
ORDER BY `bestes_ergebnis`, `timecode`
  • Mit Derived Table (MySQL >= 4.1.x):
Code:
SELECT
  `g`.`golfspieler`,
  `g`.`schlaege_gesamt` AS `bestes_ergebnis`,
  `g`.`timecode`
FROM
  `golfer` `g`
JOIN
  (SELECT `golfspieler`, MIN(`schlaege_gesamt`) AS `min_schlaege_gesamt`
   FROM `golfer`
   GROUP BY `golfspieler`
  ) `x`
ON `g`.`golfspieler` = `x`.`golfspieler` AND
   `g`.`schlaege_gesamt` = `x`.`min_schlaege_gesamt`
ORDER BY `bestes_ergebnis`, `timecode`


Mit einer temporären Tabelle sollte es auch noch irgendwie gehen, aber da musst du jemanden fragen, der sich damit auskennt.

Grüße,
Matthias
 
Erstmal vielen Dank für die ausführliche Antwort.

ABER LEIDER ... muss ich zugeben .. verstehe ich diese Abfragen nichtmal im Ansatz.

Ich werde mich da wohl erstmal weiter belesen müssen, bis ich dieses Problem lösen kann. Mit dem bloßen Kopieren Deines Codes funktioniert es leider nicht.

:(

EDIT:

Ich habs für mich jetz erstmal gelöst, indem ich die ganze Tabelle vor der Durchführung der Abfrage nach den geringsten Schlägen und dem zugehörigen Timecode sortiere.

Ich befürchte zwar, dass sowas evtl. sehr serverlastig ist - aber anders hab ich mir nicht zu helfen gewusst.

Hier nochmal der aktuelle Code

PHP:
mysql_query("ALTER TABLE golfstatistik ORDER BY schlaege_gesamt,timecode");
mysql_select_db($datenbankname);
$abfrage_player=mysql_query("SELECT timecode, golfspieler, MIN(schlaege_gesamt) AS bestes_ergebnis 
                                                  FROM $tabelle_1 
                                                  GROUP BY golfspieler
                                                  ORDER BY bestes_ergebnis, timecode 
                                                  LIMIT 5");
 
Zuletzt bearbeitet:
Zurück