Top 25 für den aktuellen Tag, Monat, Jahr und Gesamt

PHP-Fan

Erfahrenes Mitglied
Hallo,

es ist schon ziemlich spät - ich weiß. Vielleicht liegt es auch daran das ich zu keiner Lösung komme. Aktuell werden bei mir für bestimmte Datensätze Klicks gezählt, mir einer Reloadsperre via IP. Das klappt auch super. Diese Klicks zeigen aber logischerweise nur die Gesamtklicks an (daraus kann man dann einfach eine Top 25 bauen). Wie kann ich es via SQL und PHP aber realisieren, dass ich für bestimmte Datensätze die Klicks vom aktuellen Tag, Monat und Jahr bekomme. Wie kann ich das machen? Irgendwie bekomme ich da in meinem Gehirn keine logische Lösung zustande.

Vielen Dank für eure Hilfe.
 
Zuletzt bearbeitet:
Wie sind die Klicks gespeichert? Eine SQL-Tabelle wo jeder Klick mit Zuordnungs-ID und Zeitstempfel drin steht?

Wenn ja, dann kannst du mit DATE_SUB arbeiten. Dann mit IF() den Wert 1 oder 0 ausgeben und diese aufsumieren
SQL:
SELECT
  site_id,
  SUM(IF(`my_timestamp_field` >= DATE_SUB(NOW(), INTERVAL 1 DAY), 1, 0)) AS in_day,
  SUM(IF(`my_timestamp_field` >= DATE_SUB(NOW(), INTERVAL 1 MONTH), 1, 0)) AS in_month,
  SUM(IF(`my_timestamp_field` >= DATE_SUB(NOW(), INTERVAL 1 YEAR), 1, 0)) AS in_year
FROM
  my_klick_table
GROUP BY
  site_id
 
Zuletzt bearbeitet von einem Moderator:
Ja genau. Das ist der Ansatz den ich gebraucht habe. Wie sieht das Performancetechnisch aus? Wobei man das ja auch auslagern und alle X Stunden aktualisieren kann.

Vielen Dank!
 
Du meinst mit auslagern dieses Resultat in eine weitere Tabelle schreiben? Ja, kannst einen Cronjob machen. Aber bringt es was? Wieviel mal wird auf diese Statistik zugegriffen?

Was du sicher mal noch kannst, sind die Daten auf ein Jahr eingrenzen.
SQL:
SELECT
  site_id,
  SUM(IF(`my_timestamp_field` >= DATE_SUB(NOW(), INTERVAL 1 DAY), 1, 0)) AS in_day,
  SUM(IF(`my_timestamp_field` >= DATE_SUB(NOW(), INTERVAL 1 MONTH), 1, 0)) AS in_month,
  SUM(IF(`my_timestamp_field` >= DATE_SUB(NOW(), INTERVAL 1 YEAR), 1, 0)) AS in_year
FROM
  my_klick_table
WHERE
  `my_timestamp_field` >= DATE_SUB(NOW(), INTERVAL 1 YEAR
GROUP BY
  site_id

Ein Index aif die site_id und dein Timestamp-Feld kann sicher auch nicht schaden.
 
Zuletzt bearbeitet von einem Moderator:
Wenn es um mehrere Tausend Datensätze geht, die von mehreren Tausend Besuchern täglich aufgerufen werden, wäre es sinnvoll so eine Tabelle auszulagern, damit diese nicht immer neu berechnet wird. Je nachdem wieviel Datensätze es wirklich werden könnte die oben genannte Anfrage langsam werden. Du hast mir aber den richtigen Ansatz gezeigt, damit komme ich weiter.

Einen Index werde ich auf die beiden Felder natürlich setzen.

Vielen Dank!
 
Mittels eines Cronjobs ein Script ausführen lassen.

SQL:
-- Alte Daten löschen
TRANCATE myTempTable;

-- Daten neu einfügen
INSERT INTO myTempTable (site_id, in_day, in_month, in_year)
SELECT
  site_id,
  SUM(IF(`my_timestamp_field` >= DATE_SUB(NOW(), INTERVAL 1 DAY), 1, 0)) AS in_day,
  SUM(IF(`my_timestamp_field` >= DATE_SUB(NOW(), INTERVAL 1 MONTH), 1, 0)) AS in_month,
  SUM(IF(`my_timestamp_field` >= DATE_SUB(NOW(), INTERVAL 1 YEAR), 1, 0)) AS in_year
FROM
  my_klick_table
WHERE
  `my_timestamp_field` >= DATE_SUB(NOW(), INTERVAL 1 YEAR
GROUP BY
  site_id;
 
Zuletzt bearbeitet von einem Moderator:
Zurück