Hallo.
Bei vielen Communitys hat man ja die Möglichkeit die Benutzer nach ihrer letzten Aktivität zu sortieren.
Bei meinem Projekt ist dass so das ich bei jedem Seitenaufruf den aktuellen Timestamp in den Benutzereintrag speichere
Code:
UPDATE `user` set `last_activity` = '$timestamp' LIMIT 1;
Wenn man nun viele Mitglieder hat möchte man ja nicht alle auf einmal auflisten, das heißt man muss eine Funktion zum weiterblättern anbieten.
Ich versuche mich gerade darin aber ich stoße dabei auf einige Probleme.
Ich habe zwei Möglichkeiten im Kopf, die aber beide nicht optimal sind.
-
Die erste ist eine Paginierung über die MYSQL funktion limit.
Erste 10 Benutzer anzeigen:
Code:
SELECT * FROM `my_user` ORDER BY `last_activity` DESC limit 10;
Die nächsten 10 Benutzer anzeigen:
Code:
SELECT * FROM `my_user` ORDER BY `last_activity` DESC limit 10,10;
Was mich daran stört ist zum einen die Performance wenn man sehr weit blättert (limit 100000,10), zum anderen das sich die Reihenfolge ständig verschiebt (bis ich zur zweiten Seite blättere vergehen vielleicht ein paar Minuten, diejenigen die vorher aktiv waren rutschen vielleicht weiter nach hinten, ich sehe womöglich dieselben Einträge auf Seite 2 die zuvor auf Seite 1 waren.)
-
Die andere Möglichkeit die ich im Kopf habe ist diese hier:
Erste 10 Benutzer anzeigen:
Code:
SELECT * FROM `my_user` ORDER BY `last_activity` DESC limit 11;
Die nächsten 10 Benutzer anzeigen:
Code:
SELECT * FROM `my_user` WHERE `last_activity` >= '$last_timestamp' ORDER BY `last_activity` DESC limit 11;
Ich selektiere 11 Benutzer, ich zeige dem Benutzer aber nur 10 Mitglieder. Wenn ein elftes Mitglied gefunden wurde biete ich einen Link zum weiterblättern an. Diesem Link gebe ich den timestamp des letzten (zehnten) gefundenen Mitgliedes an.
Vorteil ist die Performance (ich kann ohne Beschränkung immer weiter blättern) und die gleichbleibende Reihenfolge (keine doppelten Einträge), größter Nachteil ist das ich nur Benutzer finde die nach meiner Suche nicht mehr online waren und ich nicht zurück blättern kann.
Wenn gerade 100 Benutzer online sind, wird mir die zweite Variante nur 10 davon zeigen, die anderen 90 werden "verschluckt". Dabei sind gerade diese 90 ja etwas interessanter (weil sie online sind und ich nach dem zuletzt online Status sortiere).
Wenn per Zufall mehr als 10 Mitglieder zur selben Sekunde offline gegangen sind, werden womöglich noch mehr Mitglieder verschluckt.
Ich bevorzuge die zweite Variante, aber sie ist nicht optimal.
Gibt es überhaupt eine elegantere Lösung oder zerbreche ich mir umsonst den Kopf?
PS: obige code schnippsel sind lediglich Pseudocode um das Prinzip zu verdeutlichen.