Sortierung Array & DB gleichzeitig ...

Individuum

Mitglied
[gelöst] Sortierung Array & DB gleichzeitig ...

Hi, also der CODE: ( keine Panik Problemstellung unter dem code ;))
PHP:
// Rangliste Fahrer

echo "<table width=\"500\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">";
echo "<tr class=\"table-head\"><td colspan=\"4\"><div align=\"center\">Rangliste Fahrer</div></td></tr>";

$db1->query("	SELECT fahrer.id AS FId, ergebnisse.platz AS Platz, ergebnisse.rennen AS Rennen
				FROM fahrer
				JOIN ergebnisse
				WHERE fahrer.id = ergebnisse.fahrer AND fahrer.aktiv = 'Y' AND ergebnisse.platz <=8 AND ergebnisse.platz >0
				ORDER BY FId, Rennen ");

while($dbout = $db1->fetch()) 
{
	$Points = 0;
	switch ($dbout["Platz"]) 
	{
	 case 1: $Points = 10; break;
	 case 2: $Points = 8; break;
	 case 3: $Points = 6; break;
	 case 4: $Points = 5; break;
	 case 5: $Points = 4; break;
	 case 6: $Points = 3; break;
	 case 7: $Points = 2; break;
	 case 8: $Points = 1; break;
	}
	If ( $FahrerPt[$dbout["FId"]] == "") $FahrerPt[$dbout["FId"]] = 0;
	$FahrerPt[$dbout["FId"]] = $FahrerPt[$dbout["FId"]] + $Points;
}

// Ausgabe
$db1->query("	SELECT fahrer.id AS FId, fahrer.Nachname, fahrer.Vorname
				FROM fahrer
				WHERE fahrer.aktiv =  'Y'
				ORDER  BY FId");

$i = 0;
while($dbout = $db1->fetch()) 
{
	$i++;
  	echo "<tr class=\"table-content\"><td>".$i."</td><td>".$dbout["Vorname"]."</td><td>".$dbout["Nachname"]."</td><td>". $FahrerPt[$dbout["FId"]] ."</td></tr>\n";
}


echo "</table>";

Die Ausgabe:
Code:
Rangliste Fahrer 
1 Michael Schumacher_____62 
2 Rubens Barrichello _____45 
3 Ralf Schumacher ______44 
4 Juan Pablo Montoya ____39 
5 David Coulthard _______32 
6 Kimi Räikkönen_______ 17 
7Jarno Trulli___________ 0
8 Fernando Alonso ______3

Ihr seht mein Problem.
Die Fahrer werden nach ID ausgegeben, ich hätte es aber gerne so das der mit den meisten Punkten an #1 geführt wird und dann absteigend.
Aber ich weiss nicht wie ich das realisiern soll, da die Daten aus der DB kommen und die Punkte des Fahrers ja im Array _$FahrerPt[$dbout["FId"]]_ stecken.

Mir fehlt einfach eine Idee wie ich die Sortierung nach Punkten gestalte / löse.
Bin für alle Ratschläge offen.

Euer Indi
 
Zuletzt bearbeitet:
Hi

Änder doch einfach die DB Abfrage und mach anstatt ORDER BY Fid lieber ORDER BY fahrer.punkte (oder wie das in deiner tabelle heisst).

Andreas
 
Naja das Problem ist halt das in der Ergebniss-Tabelle lediglich der Platz gespeichert ist und nicht die Punkte ( diese werden anhand des Platzes ermittelt)
Und nach Platz kann ich ja auch nicht sortieren da Platz 0 = ausgeschieden ist.

Ich stecke somit in einer Sackgasse ;)
 
Ich hoffe meine Theorie hilft Dir und ist verständlich: Ich würde eine zweite Tabelle anlegen, die die Plätze und deren Punkte enthält. Quasi der Ersatz für die Switch-Case-Abfrage. Dann kannst Du nämlich diese Tabelle in Deiner SQL-Anweisung hinzu joinen, nach Fahrern gruppieren, die Sum-Funktion auf die Punkte anwenden und das Ergebniss nach diesen sortieren. Also bekommst Du alle Daten in aufbereiteter Form aus einer SQL-Anweisung.

snuu
 
Wenn ich dich richtig verstehe, willst du doch gerne allen Plätzen ab 1 Punkte vergeben - und zwar in zweierschritten genau entgegengesetzt zum jeweiligen Platz. Der nullte Platz soll aber mit 0 Punkten bewertet werden.
Um diese Ausgabe zu erreichen hätte ich geschrieben:
Code:
SELECT FId,FVorname, FNachname, Punkte FROM 
(SELECT fahrer.id AS FId, fahrer.Vorname AS FVorname,fahrer.Nachname AS FNachname, ((SELECT MAX(platz) FROM ergebnisse)+2-(E.platz*2)) AS Punkte FROM fahrer F INNER JOIN ergebnisse E ON F.id = E.fahrer
WHERE F.aktiv = 'Y' AND E.platz>0
UNION
SELECT fahrer.id AS FId, fahrer.Vorname AS FVorname,fahrer.Nachname AS FNachname, 0 AS Punkte FROM fahrer F INNER JOIN ergebnisse E ON F.id = E.fahrer
WHERE F.aktiv = 'Y' AND E.platz=0
) ORDER BY Punkte

Das SELECT MAX wird nur einmal ausgeführt, da es Non-Correlated ist, drückt also nicht auf die Performance.
Kannst auch statt "E.platz>0" "E.platz BETWEEN 1 AND 10" schreiben.
Das ist besser als < AND >
Eventuell musst du die 0 beim zweiten SUB-SELECT '0' schreiben, bin gerade nicht ganz sicher, da ich es nicht ausprobiert habe. :)

*edit*
Das hat so aber nichts mit PHP zu tun, sondern mit "höherem" SQL, da du alles in einem Select-Statement von der Datenbank errechnen lässt...:p
 
Zuletzt bearbeitet:
Wenn ich dich richtig verstehe, willst du doch gerne allen Plätzen ab 1 Punkte vergeben - und zwar in zweierschritten genau entgegengesetzt zum jeweiligen Platz
Es handelt sich anscheinend um die Berechnung der Fahrerpunkte in der Formel 1. Da können sich die Regeln bezüglich der Punktevergabe schon mal ändern. Also würde ich die Informationen der Platz-Punkt-Beziehung in einer zweiten Tabelle ablegen und nicht eine fest definierte Berechnung im SQL-Statement erfolgen lassen.

snuu
 
Danke für eure Antworten.

Ich werde mich nun gleich mal an die Arbeit machen.

Snuu deine Idee finde ich nicht schlecht, da mir die Kenntnise fehlen konnte ich noch nicht alles in einer SQL-Abfrage lösen.
Aber ich versuche es nun mal mit der 2. Tabelle für Platz & Punkte.
Und Ihr liegt da richtig es ist die Punkteverteilung der Formel 1 (soll mal ein Wettsystem geben, aber nur so um PHP richtig zu lernen).

EDIT:

Also ich habe das Problem mit einer 2. Tabelle für die Punkte und folgender SQL-Anweisung gelöst:

Code:
SELECT teams.id AS TId, sum( PPunkte.punkte ) AS Punkte
FROM teams
JOIN ergebnisse
JOIN PPunkte
WHERE teams.id = ergebnisse.team AND ergebnisse.platz = PPunkte.platz AND teams.aktiv = 'Y' AND ergebnisse.platz
BETWEEN 1 AND 10 
GROUP BY TId
 
Zuletzt bearbeitet:
Zurück