SELFPHP: Version 5.8.2 Befehlsreferenz - Tutorial – Kochbuch – Forum für PHP Einsteiger und professionelle Entwickler

SELFPHP


Professional CronJob-Service

Suche



CronJob-Service    
bei SELFPHP mit ...



 + minütlichen Aufrufen
 + eigenem Crontab Eintrag
 + unbegrenzten CronJobs
 + Statistiken
 + Beispielaufrufen
 + Control-Bereich

Führen Sie mit den CronJobs von SELFPHP zeitgesteuert Programme auf Ihrem Server aus. Weitere Infos



:: Buchempfehlung ::

TYPO3 Kochbuch

TYPO3 Kochbuch zur Buchempfehlung
 

:: Anbieterverzeichnis ::

Globale Branchen

Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP  

 

:: Newsletter ::

Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!

Vorname: 
Name:
E-Mail:
 
 

Zurück   PHP Forum > SELFPHP > MySQLi/PDO/(MySQL)

MySQLi/PDO/(MySQL) Anfänger, Fortgeschrittene oder Experten können hier Fragen und Probleme rund um MySQLi/PDO/(MySQL) diskutieren

Antwort
 
Themen-Optionen Ansicht
  #1  
Alt 04.05.2013, 19:39:08
Splitter13 Splitter13 ist offline
Anfänger
 
Registriert seit: Dec 2010
Alter: 33
Beiträge: 1
Beste Praktik zum sortieren nach letzter Aktivität / Paginierung

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.
Mit Zitat antworten
  #2  
Alt 05.05.2013, 09:56:01
Ckaos Ckaos ist offline
Member
 
Registriert seit: Nov 2007
Beiträge: 843
AW: Beste Praktik zum sortieren nach letzter Aktivität / Paginierung

Hi,

Zitat:
das sich die Reihenfolge ständig verschiebt
Ist nunmal so wenn es sich um ein Livesystem handelt.

Zitat:
Gibt es überhaupt eine elegantere Lösung oder zerbreche ich mir umsonst den Kopf?
Zu welcher Frage?
Was muss und was kann?

Wenn du nur einen Auzug des momentes zeigen willst, schieb doch die uid's und timestamps in eine "LastActivity" Tabelle. Z.B. die letzten 100 beim Aufruf deiner Statistikseite.
Beispiel:
showuser?do=lastactiv
- MySQL->letzten 100 in tmp schreiben
- MySQL -> ersten 10 zeigen
usw

mfg

CKaos
PS: Oder halt per Ajax alle X sek. aktualisieren/anzeigen (siehe FaceB oder YouTube)
__________________
"Wenn die Leute Häuser so bauen würden, wie wir Programme schreiben, würde der erstbeste Specht unsere Zivilisation zerhacken."
In den allermeisten Fällen sitzt der Bug etwa 40 cm vor dem Monitor!
Mit Zitat antworten
Antwort

Stichworte
last activity, mitgliedersuche, paginieren, sortieren, zuletzt online


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind aus.
[IMG] Code ist aus.
HTML-Code ist aus.

Gehe zu


Alle Zeitangaben in WEZ +2. Es ist jetzt 12:26:25 Uhr.


Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.


© 2001-2024 E-Mail SELFPHP OHG, info@selfphp.deImpressumKontakt