Bingo-Ladder-Fehler

marc

Stern des Forums
ID: 10458
L
25 April 2006
6.125
772
Hallo,

wie auf dem Bild zu sehen, spinnt die Bingo-Ladder noch ein wenig.
Irgendwie sind da alle Platzierungen durcheinander...mal ist man 6ter, dann aber in der Verfolgerstatistik auf einmal 4ter...und bei der Statistik für die verfallenen Punkte, steht man auf Platz 11 und ist zugleich Letzter?!
Da müsste vielleicht noch einer ran :ugly:

Aber echt super, dass es so ne Übersicht mal gibt :mrgreen:



Gruß
 
ich sehe keinen Fehler?
Du hast am 2.meisten Bingopunkte (18 ), am 6.meisten Gutscheine (3) und bist der erste mit 100% abgeholten Punkten und in DIESER Rangliste auf Rang 11?
 
Bingo-Ladder-Fehler besteht immernoch

Hallo,

wie auf dem Bild zu erkennen kalppt die Ladder für die Bingo-Points immer noch nicht richtig.
Bei der Gutschein-Ladder bin ich beispielsweise bei der Ansicht der engsten Verfolgern auf Platz 6...in den TopTen erscheine ich aber nicht...
Bei der BP-Ladder sind meine engsten Verfolger auch IMMER einen Bingopoint vor- bzw. hinter mir...als ob es keinen User mit gleich vielen Bingopoints gibt...

Ist hier eine Korrektur möglich?!

Danke schon mal :)

 
Bei der BP-Ladder sind meine engsten Verfolger auch IMMER einen Bingopoint vor- bzw. hinter mir...als ob es keinen User mit gleich vielen Bingopoints gibt...
Das ist normal und in jeder Verfolgeransicht so. Das ist ja sortiert nach Wert X (hier: Bingo Punkte) und nix anderem. Du bist exemplarisch als 556. genannt. Natürlich sind da gleichzeitig noch 500 andere mit 4 Punkten auf diesem Platz. Man interessiert sich ja aber nicht für sekundäre Sortierparameter, sondern mit vielen Punkten man 1 weiter nach vorne kommt. Nur in den Plätzen 1-10 kommen sekundäre Parameter zum Einsatz (BP>GS>%Cl). Irgendwie muss man da ja sortieren, dass man ne Top10 hinbekommt.

Bei der Gutschein-sortierten Ladder ist es genauso in der Verfolgeransicht. Dass die Verfolger aber nicht konsistent mit Platz 1-10 (7.) sind könnte ein Bug sein, da schau ich nach.
 
Ladder-Bug

Hallo Lukas und vielen Dank für die schnelle Antwort.
Dein Argument mit dem Interesse, dass man eins weiter nach vorne kommt, kann ich zwar auch nachvollziehen, aber wenn man die sekundären Werte mit einbeziehen würde und die ganzen Ranglisten danach aufbauen würde, käme man ja auch ggf einen Platz nach vorne wenn man sich im Sekundärwert eins verbessert.
Und zudem kämen dann solch falsche Darstellungen nicht mehr zustande wie nach meinem eben gewonnenen BingoPoint :dance:
Wie man im Bild unten erkennen kann bin ich jetzt 10ter und 6ter zugleich :ugly:

Mein Verbesserungsvorschlag wäre die Primärwerte hier in diesem Fall meinetwegen x1000 zu nehmen und die Sekundärwerte einfach zu zählen...so sollte es doch gelingen eine lupenreine Rangliste hinzubekommen.

Beispiel für die Gutschein-Ladder: User1 hat 10GS/35BP, User2 hat 10GS/20BP, User3 hat 10GS/25BP, User4 hat 10GS/10BP, User5 hat 10GS/30BP, User6 hat 9GS/35BP, User7 hat 9GS/40BP,...
Somit wäre folgende Reihenfolge korrekt:

1. User1 10GS 35BP (interne Datenbank-Punktwertung: 10035)
2. User5 10GS 30BP (10030)
3. User3 10GS 25BP (10025)
4. User2 10GS 20BP (10020)
5. User4 10GS 10BP (10010)
6. User7 9GS 40BP (9040)
7. User6 9GS 35BP (9035)
...

Bis 200 Gutscheinen bei einer Person wäre man so auf der sicheren Seite ;-)

Wenn User die absolut gleiche Zahl haben...primaär, wie sekundär, dann könnte ich noch verstehen, dass die eben beide den gleichen Platz haben, so wie ich jetzt zB mit User 55443 zusammen, aber ggf kann man die Liste der absoluten Verfolger ja noch erweitern, so dass einem je die drei nächsten nach oben/unten angezeigt werden...falls das nicht zu viele Ressourcen frisst ;-)

Kannst ja mal drüber nachdenken...ich fänd' es gut wenn es dahingehend geändert würde - denn ich finde es bringt nichts wenn man weiß, wann man jemanden in einer Rangliste überholt, obwohl diese Rangliste nicht so wirklich richtig ist...

 
Das ist eigentlich schon so, dass ich überall Sekundärparas mit einbeziehe. ;)
Zumindest alle, die in der Ladder auch sichtbar sind - damit man weiß, warum man ggf. eins weiter vorne is als der mit gleichvielen Primärpunkten. Bei der Gutschein-Ladder hab ich das nur vergessen glaub ich (in den Top 10). Hatte nur noch keine Zeit zum Guggen ... Montag!

Wenn User die absolut gleiche Zahl haben...primär, wie sekundär
Das passiert sehr selten ...
... aber da sortiere ich als letztes einfach nach User-ID. :p

Edit: Ich hab nachgeschaut. Scheint ein Logikfehler zu sein.
Bei den Top10 hole ich einfach die normale Top10, sortiert nach gs,bp,cl.

An der Stelle "welchen Platz hat der User selbst?", schaue ich, wieviele User MEHR Bingopunkte haben als dieser User, denn den eigenen Platz sehe ich mit allen gleichen Usern als geteilt an. Sprich in Deinem Fall: 5 User haben definitiv MEHR Bingopunkte. Somit bist Du der 6. beste User (zusammen mit X anderen). Irgendwie bin ich mir aber nich sicher ob das so korrekt is. ^^

Edit2: Es ist mir schon bewusst, dass ich einfach das Ergebnis der Topliste weiter benutzen könnte, aber das ist nicht arg effizient, wenn man selbst erst auf Platz 12.371.263 (theroetisch) kommt und man vorher alles durchlaufen müsste zum Suchen. Nur häng ich grade an der Logik, wie ich den eigenen Platz per Suchausdruck direkt aus der DB finde mit exakter Beibehaltung der Sortierung wie in der Top10.

Edit3: Ich bin nicht der Einzige mit dieser Frage
https://forums.mysql.com/read.php?52,29404,115305
Naja, da die Ladder eh gecached wird, weiche ich im Notfall auf die Spaghetti-Variante aus.
 
Wenn die Ladder eh gecacht wird, kannst du doch in diese Cache-Tabelle noch die Platzierung mit aufnehmen (@rank = @rank + 1).
 
Jap, nur das Cachen an sich ist halt unschön, da ich 1x das *komplette* result verarbeiten muss, anstatt limit 1,10 zu machen und dann noch 2 schnelle count(*) queries ... je nachdem, auf welcher Position der User gerade ist. Worst Case also: 320.000 rows. Ich achte eigentlich immer auf "was wäre wenn klamm mal 10mio user hat" ;)

Geht trotzdem in 2sek aber ist halt bäh.
Hier wäre das "fixed" resultat.
 

Anhänge

  • fix.JPG
    fix.JPG
    24,1 KB · Aufrufe: 19
Jap, nur das Cachen an sich ist halt unschön, da ich 1x das *komplette* result verarbeiten muss, [...]
Oder um das mal anders zu betonen:
Jap, nur das Cachen an sich ist halt unschön, da ich *1x* das komplette result verarbeiten muss, [...]
Du kannst auch die Position "suchen", indem du fragst,
Code:
[FONT=Courier New][B][COLOR=#9932cc]SELECT[/COLOR][/B] [B][COLOR=#9932cc]COUNT[/COLOR][/B][COLOR=#9932cc]([/COLOR]*[COLOR=#9932cc])[/COLOR]
[B][COLOR=#9932cc]FROM[/COLOR][/B] bingo_points
[B][COLOR=#9932cc]WHERE[/COLOR][/B] points > 42;[/FONT]
Das is aber auch n Full-Table-Scan wegen dem Größerzeichen.
Vorteil davon, dass du "echte" Plätze mit Gleichständen hast. Ob und wie man das effizient hinkriegt, darfst du dir überlegen :mrgreen:

Ich persönlich würde einmal am Tag (so um 2 Uhr, wenn 98% ihre Bingo-Points kassiert haben) die Bingo-Ladder berechnen, dass die danach so aussieht:
RealRank|KID|#BP|#GS|InteralRank
1|167126|34|7|1
2|10597|23|5|2
2|112341|17|5|3
2|344567|12|5|4
2 | 5214 | 7 | 5 | 5
3|67388|18|4|6
3|52870|18|4|7
3|88344|17|4|8
3|27058|8|4|9
3 | 10458 | 5 | 4 | 10
3|9844784|16|4|11
4 | 47114711 | 18 | 3 | 12
4|87477487|4|3|13

Und jetzt nehm ich einen Platz drüber und einen Platz drunter, derart, dass

  • Drüber:
    • RealRank(above) = RealRank(mine) - 1 &&
    • InteralRank(above) = MAX(InteralRank)
  • Drunter:
    • RealRank(below) = RealRank(mine) + 1 &&
    • InteralRank(below) = MIN(InteralRank)
In diesem Fall also Drüber is KID 5214, Drunter is fiktive KID 47114711.
 
Oder um das mal anders zu betonen:
Du kannst auch die Position "suchen", indem du fragst,
Code:
[FONT=Courier New][B][COLOR=#9932cc]SELECT[/COLOR][/B] [B][COLOR=#9932cc]COUNT[/COLOR][/B][COLOR=#9932cc]([/COLOR]*[COLOR=#9932cc])[/COLOR]
[B][COLOR=#9932cc]FROM[/COLOR][/B] bingo_points
[B][COLOR=#9932cc]WHERE[/COLOR][/B] points > 42;[/FONT]
Dann bekomme ich nur den "Real-Rank" nach dem, was die Ladder aussagt. So hatte ich es ja die ganze Zeit (Verfolgeransicht). Das gibt aber in der Top10 Probleme, denn da müsste man dann der Konsistenz wegen auch eine Real-Rank-Top10 bauen - und da exemplarisch den aktuellen User anzeigen, sofern er sich in der Top10 auf einem geteilten Platz befindet. Das klingt wie Du schon gesagt hast - langsam. :ugly: Alle anderen Ladders sind hinreichend unique in den Werten, sodass es bis jetzt nicht aufgefallen ist. ;)

So oder so ist es ein "Full Scan", ich wollte es der Performance halber aber lieber in der DB machen als in PHP. Jetzt berechne ich das alle paar Stunden global, scanne den jeweiligen User bei Bedarf raus und cache das Ergebnis dann. Das dürfte genügen.
 
So die Ladder ist nun durchgehend mit neuem Algorithmus bestückt. Es wird nach sichtbaren Parametern sortiert, am Ende nach UserID aufsteigend (falls X Leute auf dem gleichen Platz sind). Anhand dieser sortieren End-Liste wird dann alles hingemalt.

Sonderfall: Wenn man selbst gar nicht "dabei" ist ... z.B. bei den "Top SMS Versendern". Wenn man gar keine SMS verschickt hat, ist man mit "0" ja quasi zusammen mit 200.000 anderen auf dem letzten Platz. Dann schreib ich die eigene ID trotzdem ganz unten hin, damit man das auch gleich sieht.



Im Unterschied wenn man mit 10.000 Anderen zusammen 1 SMS verschickt hätte. Dann würden diese gleichen Werte nach UserID sortiert werden und man wäre auf Platz 7748 (oder so). Ist doof aber irgendwie muss man halt schlussendlich sortieren, um eine eindeutige Reihenfolge zu erhalten.



Edit: Kleine Verbesserung für Fall #2: Teilt man sich ein Feld mit 1000nden Anderen (exakt gleiche Werte) dann setze ich den aktuellen User immer an die Spitze dieses Feldes. So kann sich niemand beschweren, dass er immer so weit hinten ist wegen seiner hohen ID. Zusätzlich ist die Verfolgeransicht interessanter, da man als Erster des Feldes den "Real-Platz" vor einem wieder erkennen kann.
 
Vielen Dank, habe zwar noch nicht alle Ladder durchgeschaut, aber das was ich geguckt habe schaut doch schon viiieeel besser und korrekter aus :clap::clap::clap:
 
Wo wir grade bei der neuen Ladder sind:
refladder1daee.png
 
Hätte nochmals nen Input zur Bingo-Ladder resp zum Top 10 Bingo:



Mir ist bewusst dass diese nach "nicht abgeholte Points" sortiert ist, trotzdem sieht es zumindest im unteren Teil doof aus wenn einer vor dir ist der eigentlich ne schlechtere Gesamtbilanz hat.
Wäre es nicht sinnvoller vllt noch einen 2ten oder 3ten Wert zu nehmen nach dem zusätzlich noch bei Gleichstand sortiert wird?

Aslo rein optische Korrektur 8)

mfg

SumoSulsi
 
Reicht doch, wenn man die Werte der sortierten Spalte fett macht, dann hast du das optische Problem gelöst, weil mit einem Blick der Fokus sofort auf der vorletzten Spalte liegt.
 
Wäre es nicht sinnvoller vllt noch einen 2ten oder 3ten Wert zu nehmen nach dem zusätzlich noch bei Gleichstand sortiert wird?
So mach ich es ja. Alle sichtbaren Werte werden sekundär mitsortiert. In dem Fall ist es aber eine "schlechte Ladder", also wer die wenigsten Sachen hat. Der über Dir hat auch 17 Punkte verpasst UND insgesamt nur 4 abgeholt, Du aber 5. D.h. Du bist insgesamt "besser", deshalb in dieser Ladder weiter hinten.