Top 50 mit PHP und SQL realisieren

Ben1895

Grünschnabel
Hallo,

erst einmal herzlichen Glückwunsch für eine gelungene Präsentation der Seite und des Forums.

Ich möchte gerne etwas umsetzen was ansich einfach zu sein scheint. Allerdings weiß ich nicht wie ich das genau umsetzen kann.

Es sollen von bestimmten Datenbankeinträgen die alle eine ID haben, die Klicks protokolliert werden. Das ganze soll allerdings so aufgebaut sein, dass man daraus eine Top 50 bauen kann. Natürlich könnte ich einfach alle Klicks zusammenzählen (die es insgesamt gegeben hat), das mache ich auch. Aber ich möchte auch wissen, welcher Datenbankeintrag (welche ID), heute, diesen Monat und dieses Jahr am meisten aufgerufen wurde. Die Gesamtzahl habe ich ja wenn ich alles zusammenzähle.

Ich weiß allerdings absolut nicht wie ich das am besten umsetzen kann. Am besten so, dass ich immer am ersten des Jahres die Tabelle in der Datenbank leeren kann und dann wieder neu gezählt wird. Die neue Tabelle soll nur für die Werte von heute, dem Monat und des Jahres erstellt werden. Die Gesamtanzahl gibt es bereits in einer anderen Tabelle.

Ich hoffe ich konnte mein Problem verständlich erklären. Ist nicht ganz so leicht.

Liebe Grüße,
Ben.
 
Tabelle: buecher

id, titel, iban, klicks (hier stehen die Gesamtklicks drin)

Etwas kastriert. So in etwa sieht es aus.
 
Für die Statisitk musst du die Klicks einzel mitzählen
Code:
Tabelle klicks
buecher_id
datum_zeit

Dann kannst du über diese Tabelle diverse Statistiken ziehen
 
Hi,

hab das mal überflogen. Spontan würde mir folgendes einfallen:

Als erstes würde ich deine DB ein wenig umändern bzw 2 spalten hinzufügen. Da du ja tages,monats,jahres stats möchtest.

id, titel, iban, Tagesklicks, Monatklicks, Jahresklicks

Danach dann einfach bei jedem klick die entsprechende datenbankzeile UPDATEN allso zb

UPDATE buecher SET Tagesklicks = Tagesklicks + 1, Monatklicks = Monatklicks + 1, Jahresklicks = Jahresklicks + 1 WHERE id = '$id'

Dann bei jeden Tag, Monat, Jahr ein cronjob durchlaufen lassen was alle tages, monats, jahres stats auf 0 setzt.

mfg
sebbo
 
@yaslaw: In welchem Format speichere ich die Zeit? Timestamp oder DATE oder DATETIME und wie komme ich dann die die besagten Daten (heute, Monat, Jahr)? Ein kleines Beispiel wäre sehr lieb.

@Sebbo90: Ich werde auf jedenfall eine weitere Tabelle dafür anlegen wie es yaslaw vorgeschlagen hat. Ich finde deine Lösung kompliziert auch wenn sie wahrscheinlich funktioniert.

Danke schon einmal an euch!
 
Zuletzt bearbeitet:
Ja es funktioniert natürlich beides. Yaslaws variante scheint auch einfacher zu sein nur bläht das je nach klicks richtig die db auf und du kommst um weiteren code nicht ohne weiteres herum. So hat man eben halt gleich die richtige Anzahl klicks usw.

Naja viele wege führen nach Rom ;)

mfg
 
yaslaws Variante ist auch etwas dynamischer. Bei deiner Variante passiert irgendein Fehler bei den Jahres-Werten und dann war es das. Bei yaslaws Variante könnte ich das dann einfach neu berechnen... Nur weiß ich noch nicht ganz wie ich an die getrennten Werte rankomme.

Die Werte die dann aus der besagten DB kommen werden ja nur einmal die Stunde (z.B) aktualisiert (wieder an einem anderen Ort, logischerweise). Die Tabelle mit den Klicks ist eben nur da, damit es auch immer wieder berechnet werden kann. Natürlich wird nicht bei jedem Useraufruf neu berechnet. Das sprengt in der Tat die Datenbank - gerade wenn es in die Zehntausende-User-täglich geht.
 
Zuletzt bearbeitet:
timestamp ist das was du am besten nimmst.

Meine Variante ist eine einfache Normalisierung. Die Variante von Sebbo hat das Problem, dass immer Anfangs Monat alles Monatsfelder auf 0 zurückgesetzt werden müssen (dito jeden Tag für die Tagesklicks etc) und man somit keine Historie hat: Wie viele Klicks hatte ich vor 2 Monaten, letzten Monat, diesen Monat.
Mit der normalisierten Variante ist man auch in Zukunft für weitere Auswertungen der Daten gewappnet.
 
yaslaws Variante ist auch etwas dynamischer. Bei deiner Variante passiert irgendein Fehler bei den Jahres-Werten und dann war es das. Bei yaslaws Variante könnte ich das dann einfach neu berechnen... Nur weiß ich noch nicht ganz wie ich an die getrennten Werte rankomme.

Die Werte die dann aus der besagten DB kommen werden ja nur einmal die Stunde (z.B) aktualisiert (wieder an einem anderen Ort, logischerweise). Die Tabelle mit den Klicks ist eben nur da, damit es auch immer wieder berechnet werden kann. Natürlich wird nicht bei jedem Useraufruf neu berechnet. Das sprengt in der Tat die Datenbank - gerade wenn es in die Zehntausende-User-täglich geht.

sry habe den post nicht weiter verfolgt daher die späte antwort nun, vll hilft sie dir ja noch:

Du könntest bei der abfrage mit between arbeiten und die link ids gleichzeitig counten. Ungefähr so in dem schema:

PHP:
SELECT buecher_id, datum_zeit, COUNT(*) AS count FROM klicks WHERE datum_zeit BETWEEN '1301179319' AND '1301179399' GROUP BY buecher_id ORDER BY count DESC LIMIT 50

falls ich die abfrage erklären soll, sag bescheid.

mfg
sebbo
 
Zuletzt bearbeitet:
Zurück