Ranking funktion

saila

Erfahrenes Mitglied
Hi,

folgende MySQL-Tabelle:
Code:
+------------+------------+-----------+
|    id       |  spalte_x  | werte     |
+------------+------------+-----------+
|     1      |     2      |   10      |
+------------+------------+-----------+
|     1      |     1      |   8       |
+------------+------------+-----------+
|     1      |     7      |   2       |
+------------+------------+-----------+
|     1      |     5      |   6       |
+------------+------------+-----------+
|     1      |     2      |   8       |
+------------+------------+-----------+
Die Spalte x könte z.B. eine User-ID darstellen (ist aber nicht Diskussionsgrundlage).
Es geht um die Spalte Werte.

Diese soll jeweils passend zur spalte_x addiert werden und dann nach top 10 oder flop 10 ausgewertet werden.

Hat jemand Ideen dazu?
 
Mit der Tabelle geht das nicht, du brauchst 2 Felder, eines für die Werte, die immer addiert werden (Also User 1 gibt 5 Punkt, User 2 gibt 2 Punkte, dann steht in dem Feld 7 drin) und ein Feld für die Anzahl der Votes (Also in unserem Fall 2). Dass dividierst du dann, ergibt bei uns 3,5 als Punkte. Zum Auslesen der Top 10 und Flop 10 musst du einfach die ersten 10 Einträge aus der DB holen, nach dem dividierten Wert reihen und einmal aufsteigend, und einmal absteigend reihen.Klaro?*g*
 
Probier es mal mit folgender Abfrage:
Code:
SELECT `spalte_x` , SUM( `werte` ) AS `summe`
FROM `tabelle`
GROUP BY `spalte_x`
ORDER BY `summe` DESC
LIMIT 10
Das wäre für die „Top 10“. Für die „Flop 10“ einfach die Sortierreihenfolge von DESC auf ASC ändern.
 
Ok, das funktioniert! Cool. Brett ist auch weg - hätte man mit lesen auch lösen können.

Vielen Dank!
 
Könnte es sein, dass ich das Problem falsch verstanden hab?*gg*
Könnte gut sein. :D Vor allem hab ich deinen Beitrag jetzt dreimal hintereinander durchgelesen und verstehe noch immer nicht so ganz, für welches Problem du eine Lösung gesucht hast. :confused:
 
Also momentan ist die Top10/Flop10 'eigentlich' nicht korrekt.

Wenn ein Eintrag 3x 10 Punkte (also insgesamt 30) bekommt, dann muesste er hoeher stehen, als ein Eintrag, der 100x 1 Punkt (insgesamt 100) bekommen hat,
da 1 Punkt niemals soviel wert sein kann wie 10 Punkte. Egal wie oft 1 Punkt gevotet wurde.
Bei deiner Tabelle/Abfrage/Toplist (wie auch immer) ist immer der meistgewaehlte auf Platz 1 und nicht der mit der besten Bewertung. Ich hoffe du/ihr versteht was ich meine.

therealcharlie hat schon ganz recht mit seiner Erklaerung!

Um eine Korekte Toplist zu bekommen, musst du folgende Werte in deiner Tabelle speichern:
- Wieviele User haben gevoted? (x_user_count)
- Wieviele Punkte hat der jeweilige Link? (x_link_points)
- ID des Links (ist ja klar) (x_link_id)
- Link-Beschreibung/bilder/usw. (Auch klar..) (x_link_description)

Eingabe in die Datenbank beim Voten:
PHP:
$Punkte = $VergebenePunkte / ($AnzahlVotings+1); // Ausrechnen, wieviel Gewichtung das Voting hat
$NeuerPunktestand = $Punkte + $AlterPunktestand; // Punktestand aktualisieren
$VergebenePunkte sind die Punkte, die der jeweilige Voter abgibt,
$AnzahlVotings ist die bisherige Anzahl abgegebener Stimmen [aus der Spalte `x_user_count`],
$Punkte ist die Anzahl, wieviele die Stimme des jeweiligen Voters zaehlt,
$AlterPunktestand ist der bisherige Punktestand [aus der Spalte `x_link_points`].

Das laesst du dir dann per Update (oder wie auch immer) in die Datenbank schreiben ($NeuerPunktestand in die Spalte `x_link_points` und erhoehe `x_user_count` um eins).


Jetzt zur ausgabe:
Code:
SELECT *
FROM `tabelle`
GROUP BY `x_link_id`
ORDER BY `x_link_points` DESC
LIMIT 10

...(Datenbankabfrage durchfuehren, Daten speichern in Variablen, Ausgabe, usw.)...
Die Werte die du hier aus der Tabelle holst, sind korrekte Werte. Danach kannst du deine Toplist sortieren lassen!


Denk daran:
Du musst deine Topliste nicht nach Gesamt-Punkten bewerten, sondern nach Durchschnittswerten

mfg
 
Zuletzt bearbeitet:
Hi,

mir ging es vorrangig um den Query. Das restliche oder wesentliche Bestandteile eines Ranking berücksichtigt werden müssen ist von der logig selbst beantwortet.

Gegenüber den bisherigen Rankings, habe ich einige Modifikationen oder Vereinfachungen vorgenommen.

Natürlich funktioniert das Beispiel von Matthias Reitinger. Es würde auch die Möglichkeit von Suchfunktion oder therealcharlie funktionieren. Allerdings erfordert diese Variante ein Mehraufwand. Denn bei Users brauch man keine IP, sondern speichert einfach die Ranking-Id des Users. Hat er eine Stimme abgegeben, wird ihm nur noch das Ergebnis angezeigt
 
Suchfunktion hat gesagt.:
therealcharlie hat schon ganz recht mit seiner Erklaerung!

Um eine Korekte Toplist zu bekommen, musst du folgende Werte in deiner Tabelle speichern:
- Wieviele User haben gevoted? (x_user_count)
- Wieviele Punkte hat der jeweilige Link? (x_link_points)
- ID des Links (ist ja klar) (x_link_id)
- Link-Beschreibung/bilder/usw. (Auch klar..) (x_link_description)
Nö. Um das arithmetische Mittel als Sortiergröße zu verwenden, muss die Tabelle doch nicht verändert werden. Folgende Modifizierung der von mir vorgeschlagenen Abfrage reicht vollkommen aus:

Code:
SELECT `item_id` , AVG( `rating` ) AS `median`
FROM `ratings`
GROUP BY `item_id`
ORDER BY `median` DESC
LIMIT 10

Zur leichteren Verständlichkeit liegt dem folgende Tabellenstruktur zugrunde:
Code:
CREATE TABLE `ratings` (
  `item_id` int(11) NOT NULL default '0', -- Der Index des bewerteten Elements
  `rating` tinyint(2) NOT NULL default '0', -- Die Bewertung
) ;
 
Zurück