Teile eines Datensatzes zählen

Karlzberg

Erfahrenes Mitglied
Hallo,

mal wieder ich ;)

Zur Erstellung einer Rangliste möchte ich folgende Berechnung durchführen:
zussamenaddierte Punkte * Anzahl der Punktplätze / Anzahl der Turnierteilnahmen.
Die dazugehörigen Abfragen sehen so aus:

PHP:
//name und dazugehörige punkte auslesen
$sql = "SELECT
              name,
              SUM(punkte) AS punkte 
        FROM
              schmager
        GROUP BY
              name 
        ORDER BY
              punkte DESC;            
       ";
       
$result = mysql_query($sql) OR die(mysql_error());
  
//ausgegebene daten verarbeiten                    
while($row = mysql_fetch_array($result)) 
      {
        $i++;              
        echo "<tr>
                 <td align=\"center\">".$i."</td><td align=\"center\">".$row['name']."</td><td align=\"center\">".$row['punkte']."</td><td align=\"center\">".$row['punkte']*mysql_num_rows($result['punkte'])/mysql_num_rows($result['name'])."
              </tr>";           
      }

Das Ganze gibt natürlich eine Fehlermeldung aus.
Wie kann ich das also umschreiben, dass er an der Stelle
PHP:
mysql_num_rows($result['punkte'])
zählt, wie häufig der betreffende Name Einträge in der Spalte punkte hat?
Und wie kann ich es umschreiben, dass er an der Stelle
PHP:
mysql_num_rows($result['name'])
zählt, wie häufig der betreffende Name Einträge in der Spalte punkte hat?

Oder gibt es für mein Problem eine elegantere Lösung, auf die ich nicht komme?
Anmerkung:
Ich habe noch große Probleme, mir die Darstellung der Ergebnisse aus der Datenbank korrekt vorzustellen.
Momentan stelle ich mir das so vor (als Beispiel wieder mein Code), dass $row als array ausgegeben wird, das so aussieht:
$row(name1[punkte], name2[punkte]) usw., usf..
Ist das korrekt so?
Und ab wann habe ich den Zugriff auf dieses fertige Array?
Ich stelle mir das so vor, dass ich das Array z.b. mit foreach NACH der while-schleife weitervearbeiten kann. Korrekt so?
 
Zuletzt bearbeitet:
Natürlich steht in meinem Code mysql_num_rows.
Da muss ich wohl nen kleinen Fehler beim kopieren des Codes gemacht haben.
Habe es dann auch gerade mal in meinem Beitrag editiert.
 
Mir ist doch noch eine Idee gekommen, wie ich das umbauen kann.
Jetzt werden für Turnierteilnahmen bei den Spielern Einsen eingetragen, für die Platzierung in den Punkten ebenfalls.
Ohne Turnierteilnahme wird der betreffende Spieler überhaupt erst garnicht in die Tabelle aufgenommen, somit brauche ich also nur die Einsen zusammenzuzählen und bekomme meinen gewünschten Divisor.
Nimmt der Spieler am Turnier teil, platziert sich aber nicht in den Punkten, wird eine null eingetragen.
Somit kann ich auch wieder die Punktplatzierungen zusammenzählen und bekomme meinen gewünschten multiplikator.

Würde mich dennoch interessieren, ob es auch eleganter geht.
 
Zu deiner eigentlichen Frage:

SQL:
SELECT
    `name`,
     SUM(`punkte`) AS `punkte`,
     COUNT(*) AS `anzahl_teilnahmen`
FROM
    `schmager`
GROUP BY
    `name`
ORDER BY
    `punkte` DESC;

In 'anzahl_teilnahmen' sollte sich nun die Anzahl der Teilnahmen befinden - Erspart lästige Tipparbeit mit PHP im Nachhinein.
Einen Hinweis würde ich dir aber gerne noch Mitgeben:
PHP:
mysql_num_rows($result['punkte']);
Ouch! Lies dir bitte nochmal die Prototyp-Definition in der PHP-Doku zu [phpf]mysql_num_rows[/phpf] durch ^^
Code:
int mysql_num_rows(resource $Ergebnis-Kennung);
Fällt dir was auf? Deine Ergebniskennung ist $result, und das hat a) keine Arrayeigenschaft (da Resource) und b) ist $row deine abgefangene Datenmenge.
Also entweder zählst du gleich in deiner MySQL-Abfrage oder später, indem du alle Array-Elemente zählst, in denen der Name gleich dem gesuchten Namen ist. Ersteres ist natürlich wesentlich effizienter
 
Einen Hinweis würde ich dir aber gerne noch Mitgeben:
PHP:
mysql_num_rows($result['punkte']);
Ouch! Lies dir bitte nochmal die Prototyp-Definition in der PHP-Doku zu [phpf]mysql_num_rows[/phpf] durch ^^

Hallo,

ersteinmal danke für die Antworten :)

Was Du da schreibst Timmae, wurde mir bei meinen Versuchen auch bewusst, deshalb schrieb ich eingangs ja auch: "Das Ganze gibt natürlich eine Fehlermeldung aus.".
Aber so 100% schlau werd ich aus den ganzen Tutorials auch nicht, muss ich ehrlich gesagt zugeben. Daher versuche ichs meist über "just-try-and-error".

Wie gesagt, habe ich die ganze Chose deshalb auch ersteinmal etwas umgeschrieben. Ich werde Eure Vorschläge aber in einer neueren Version einbauen.
Allerdings habe ich dabei ein weiteres Problem:
In die Punkte wird Standardmäßig 0 reingeschrieben, wodurch dann eben auch Turniere mitgezählt würden, in denen der betreffende Spieler keine Punkte bekommen hat.
Wie kann ich das umgehen?

Spontan würde mir dazu einfallen:
PHP:
//SELECT usw...
COUNT (*) AS anzahl_punktplaetze
WHERE 
         punkte > 0
// usw...

Allerdings würde sich das ganze doch mit den sonstigen Ausgaben beissen, da sich das WHERE auf alles beziehen würde, was ich im SELECT stehen habe, oder irre ich da?

Und noch eine Frage zum COUNT:
In Deinem Code, Timmae, werden ja nur die Teilnahmen gezählt. Die Anzahl der Punktplatzierungen, sprich: wie oft hat der spieler punkte > 0, brauche ich aber ebenfalls.
Muss ich dafür nicht
PHP:
//SELECT usw...
COUNT ('punkte') AS anzahl_punktplatze
COUNT ('name') AS anzahl_teilnahmen
//usw...

schreiben?
 
Zurück