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)
Hilfe Community Kalender Heutige Beiträge Suchen

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 06.02.2009, 10:56:19
gpl gpl ist offline
Anfänger
 
Registriert seit: Feb 2009
Alter: 55
Beiträge: 2
Statistik nach Datum mit Nullwerten

Eher ein theroretischer Ansatz als ein konkretes Problem:

Nehmen wir an, ich habe eine Tabelle 'Besucher' in meiner Datenbank, die die jeden neuen Besucher einer Website mit Datum, Uhrzeit und z.B. die IP-Adresse erfasst.
Jetzt möchte ich diese Tabelle statistisch Auswerten in der Art, dass ich für jeden Tag angezeigt bekomme, wieviel Besucher auf der Website waren.

Nehmen wir mal diese Tabelle an:
DATUM | IP
2009-01-01 10:00:00 | 123.123.123.123
2009-01-01 11:23:25 | 231.231.231.231
2009-01-03 08:20:20 | 111.111.111.111
...

Mein Ansatz war zunächst folgender:
Code:
select datum, count(ip) from besucher 
 group by datum
Das klappt auch, bis auf das Problem, dass ich für Tage, an denen KEIN Besucher da war, auch keinen Datensatz angezeigt bekomme.
Das Ergebniss der o.g. Abfrage wäre:

2009-01-01 | 2
2009-01-03 | 1

Ich hätte jedoch gerne eine Tagesstatistik, die mir auch Nullwerte ausgibt, die also z.B. so aussieht:

2009-01-01 | 2
2009-01-02 | 0 <-- Keine Besuche am 2.1. !
2009-01-03 | 1

mir also (bei diesem Beispiel) für den 2.1. den Wert 0 ausgibt.

Ich hoffe, ich habe mich klar ausgedrückt, was ich möchte.
Diese Tabelle soll möglichst direkt per SQL erzeugt werden. Ich möchte nicht in PHP per Schleife für jeden einzelnen Tag eine Abfrage erzeugen, oder sowas ähnliches.

Wer hat dafür eine Lösung?
Mit Zitat antworten
  #2  
Alt 06.02.2009, 12:27:38
Crisps Crisps ist offline
Junior Member
 
Registriert seit: Oct 2008
Alter: 47
Beiträge: 274
AW: Statistik nach Datum mit Nullwerten

Solche Probleme löst man am besten mit einer Integer Tabelle:

Code:
CREATE TABLE integers (
  i tinyint(3) unsigned NOT NULL,
  PRIMARY KEY (i)
);

INSERT INTO integers (i) VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9);
Damit basteln wir uns dann alle Daten (ist Daten eigentlich das Plural von Datum? ) die von heute gesehen in der Verganenheit liegen (in diesem Fall die letzen 1000 Tage) und verbinden das Ergebniss mit einem LEFT JOIN mit dem Datum der Besucher-Tabelle:

Code:
SELECT DATE_SUB(CURRENT_DATE, INTERVAL 100 * h.i +10 * t.i + u.i DAY) AS d
     , COUNT(b.ip)
  FROM integers AS h
CROSS
  JOIN integers AS t
CROSS
  JOIN integers AS u
LEFT OUTER
  JOIN besucher AS b
    ON DATE(b.datum) = DATE_SUB(CURRENT_DATE, INTERVAL 100 * h.i +10 * t.i + u.i DAY)
GROUP
    BY d
ORDER
    BY d DESC
Da ich hier allerdings DATE() verwenden muss (mir fällt keine andere Möglichkeit ein) um das Datum aus DATETIME zu extrahieren, könnte diese Query vielleicht etwas langsam sein.

Geändert von Crisps (06.02.2009 um 13:11:53 Uhr)
Mit Zitat antworten
  #3  
Alt 06.02.2009, 14:36:44
gpl gpl ist offline
Anfänger
 
Registriert seit: Feb 2009
Alter: 55
Beiträge: 2
AW: Statistik nach Datum mit Nullwerten

Super! Danke! Das sieht ja schon mal gut aus. Bin zwar kein SQL-Guru, kann mir aber trotzdem vorstellen, was in der Abfrage so ungefähr vonstatten geht.

In der Praxis würde man für eine Statistik aber wahrscheinlich eher mit einem von- und einem bis-Datum arbeiten und nicht über die letzten 1000 Tage. Oder, bei einer Monatsstatistik, alle Tage eines Monats.

Wie würde das mit dem Code aussehen? Geht das?

Habe eben folgendes dazu gefunden: http://www.blognotizen.de/archives/1...ll-Werten.html

Da spricht jemand ein ähnliches Problem an, allerdings nicht mit Datums-Werten.
Mit Zitat antworten
  #4  
Alt 06.02.2009, 15:37:38
Crisps Crisps ist offline
Junior Member
 
Registriert seit: Oct 2008
Alter: 47
Beiträge: 274
AW: Statistik nach Datum mit Nullwerten

Das mit den 1.000 Tagen ist natürlich eine Limitation, aber man könnte daraus auch 10.000 oder noch mehr machen. Anders ist das jedenfalls nicht möglich, da ersteinmal alle verfügbaren Datumsangaben für jede Woche/Monat/Jahr generiert werden müssen.

Zitat:
Habe eben folgendes dazu gefunden: http://www.blognotizen.de/archives/1...ll-Werten.html

Da spricht jemand ein ähnliches Problem an, allerdings nicht mit Datums-Werten.
Ja, aber hier ist das Problem:

Code:
SELECT k.name
     , COUNT(*) AS anzahl
  FROM kategorie AS k
LEFT OUTER
  JOIN item AS i
    ON i.kategorie_id = k.id
GROUP 
    BY k.id
Würde das Ergebniss so anzeigen wie dort gewünscht. Aber mit deiner Statistik ist das leider nicht so einfach, weil das Datum für einen verfügbaren Zeitraum ja von irgendwo herkommen muss - während in diesem Beispiel die Kategorien schon ihren eigenen Eintrag in einer Tabelle haben. Um ähnlich vorzugehen, müsste man erst eine Tabelle mit allen verfügbaren Daten erstellen:

Code:
CREATE TABLE daten (
  datum DATE NOT NULL,
  PRIMARY KEY (datum)
);
Für die folgende Query braucht man die integers Tabelle die ich bereits gepostet habe:

Code:
INSERT 
  INTO daten
SELECT DATE_ADD('2000-01-01', INTERVAL tage DAY)
 FROM (SELECT tousands.i*1000 + hundreds.i*100 + tens.i*10 + units.i AS tage
         FROM integers AS tousands
       CROSS 
         JOIN integers AS hundreds
       CROSS 
         JOIN integers AS tens
       CROSS 
         JOIN integers AS units) AS x
So, jetzt wurde die Tabelle mit 10.000 Tagen ab dem 1.1.2000 gefüllt - also in etwa bis 2027. Jetzt ist es möglich, alle Einträge aus der Besucher Tabelle mit den Einträgen aus der Daten Tabelle zu verbinden:

Code:
SELECT d.datum
     , COUNT(b.ip)
  FROM daten AS d
LEFT OUTER
  JOIN besucher AS b
    ON DATE(b.datum) = d.datum
 WHERE d.datum BETWEEN '2009-02-01' AND '2009-02-28'
GROUP
    BY d.datum
ORDER
    BY d.datum DESC
Das würde dann alle Ergebnisse dieses Monats anzeigen. Die Abfrage hat aber möglicherweise auch ein Performance Problem, da man aus der DATETIME Spalte ja irgendwie das Datum extrahieren muss, was hier mit der "DATE" Funktion geschieht - Funktionen können aber leider keinen Index nutzen.
Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

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

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Gruppieren nach Datum jger3110 PHP Grundlagen 0 08.08.2008 23:23:48
Datum zu jedem Datenbankeintrag ausgeben wad PHP Grundlagen 6 09.08.2007 08:29:13
Sortierung nach Datum mit Order by nach Konvertierung ins Deutsche Format falsch carlos7262 MySQLi/PDO/(MySQL) 2 12.04.2007 08:43:32
Datum korrekt ausgeben aus Datenbank Esnabur PHP Grundlagen 6 21.03.2006 11:38:03
DATUM start DATUM ende AND Termine inthemiddle daniel son PHP Grundlagen 21 21.07.2004 14:03:49


Alle Zeitangaben in WEZ +2. Es ist jetzt 11:30:52 Uhr.


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


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