2016-04-18 6 views
2

Ich verwende MySQL für meine Datenbank. Ich habe analytische Details in einer Tabelle erstellt. Ich möchte diese Daten in einem Diagramm zeigen. Ich habe Daten über den Klick in bestimmten Link und die in der Datenbank gespeicherte Datum Zeit erstellt. Tabelle ist wieErstellen Sie Diagramm mit MySQL-Datenbank für heute, wöchentlich, monatlich und zwischen zwei Datum

id | datetime 
------------- 
1 | 2016-04-18 05:26:36 
2 | 2016-04-18 07:26:36 
3 | 2016-04-18 09:26:36 
4 | 2016-04-18 11:26:36 
5 | 2016-04-18 08:26:36 
6 | 2016-04-18 05:26:36 
7 | 2016-04-18 20:26:36 
8 | 2016-04-18 18:26:36 

I-Daten zeigen will, wie anhand von Stunde für heute wie

hour | click 
--------------- 
1 | 0 
2 | 0 
3 | 0 
4 | 0 
5 | 2 
6 | 0 
7 | 1 
8 | 1 
9 | 1 
10 | 0 
11 | 1 
12 | 0 
13 | 0 
14 | 0 
15 | 0 
16 | 0 
17 | 0 
18 | 1 
19 | 0 
20 | 1 
21 | 0 
22 | 0 
23 | 0 
24 | 0 

Ähnliches gilt für Wochen wo Wochentag (Sonntag, Montag, Dienstag, ... Samstag) statt Stunde, Wochennummer (1,2,3,4,5 ...... 28/29/30/31) für monatliches Detail.

Ich habe eine Abfrage für die heutige Liste verwendet, aber es gibt nur den Namen der Stunde, wo die Daten vorhanden sind. Ich brauche die ganze Stundenliste mit 0 füllen, wenn es in dieser Stunde keinen Wert gibt.

Ich verwende diese Abfrage.

SELECT DISTINCT(hour(`beacon_date_time`)) as hour,COUNT(*) from beaconanalytics WHERE DATE_FORMAT(`beacon_date_time`,'%Y-%m-%d') BETWEEN DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 1 DAY),'%Y-%m-%d') AND DATE_FORMAT(NOW(),'%Y-%m-%d') GROUP by hour(`beacon_date_time`) 

ich Abfrage für 7 Tage bin mit aber es wird geben auch den Rekord für den Tag in der Datenbank nicht für die Show 0 für verbleibenden Tage.

Dies ist die Abfrage.

SELECT dayname(`beacon_date_time`) as hour,COUNT(*) from beaconanalytics WHERE DATE_FORMAT(`beacon_date_time`,'%Y-%m-%d') BETWEEN DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 7 DAY),'%Y-%m-%d') AND DATE_FORMAT(NOW(),'%Y-%m-%d') GROUP by dayname(`beacon_date_time`) 
+0

Ich möchte nur diese füllen Nullen in 'PHP'-Code. Zum Beispiel haben Sie ein Array 'Stunden [1-24]' mit allen Werten initialisiert auf 0. Dann verwenden Sie Ihre Abfrage und überschreiben einige Stunden mit Daten. – akasummer

Antwort

0

Versuchen Sie dieses, aussehen wie ein wenig seltsam;)

SELECT tmp.hour, sum(tmp.click) AS click 
FROM 
    (SELECT DISTINCT 
    (hour(`beacon_date_time`)) AS hour, 
    COUNT(*) AS click 
    FROM beaconanalytics 
    WHERE DATE_FORMAT(`beacon_date_time`, '%Y-%m-%d') BETWEEN DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 1 DAY), 
                     '%Y-%m-%d') AND DATE_FORMAT(NOW(), '%Y-%m-%d') 
    GROUP BY hour(`beacon_date_time`) 
    UNION 
    SELECT 1 AS hour, 0 AS click FROM dual 
    UNION 
    SELECT 2 AS hour, 0 AS click FROM dual 
    UNION 
    SELECT 3 AS hour, 0 AS click FROM dual 
    UNION 
    SELECT 4 AS hour, 0 AS click FROM dual 
    UNION 
    SELECT 5 AS hour, 0 AS click FROM dual 
    UNION 
    SELECT 6 AS hour, 0 AS click FROM dual 
    UNION 
    SELECT 7 AS hour, 0 AS click FROM dual 
    UNION 
    SELECT 8 AS hour, 0 AS click FROM dual 
    UNION 
    SELECT 9 AS hour, 0 AS click FROM dual 
    UNION 
    SELECT 10 AS hour, 0 AS click FROM dual 
    UNION 
    SELECT 11 AS hour, 0 AS click FROM dual 
    UNION 
    SELECT 12 AS hour, 0 AS click FROM dual 
    UNION 
    SELECT 13 AS hour, 0 AS click FROM dual 
    UNION 
    SELECT 14 AS hour, 0 AS click FROM dual 
    UNION 
    SELECT 15 AS hour, 0 AS click FROM dual 
    UNION 
    SELECT 16 AS hour, 0 AS click FROM dual 
    UNION 
    SELECT 17 AS hour, 0 AS click FROM dual 
    UNION 
    SELECT 18 AS hour, 0 AS click FROM dual 
    UNION 
    SELECT 19 AS hour, 0 AS click FROM dual 
    UNION 
    SELECT 20 AS hour, 0 AS click FROM dual 
    UNION 
    SELECT 21 AS hour, 0 AS click FROM dual 
    UNION 
    SELECT 22 AS hour, 0 AS click FROM dual 
    UNION 
    SELECT 23 AS hour, 0 AS click FROM dual 
    UNION 
    SELECT 24 AS hour, 0 AS click FROM dual) tmp 
GROUP BY tmp.hour 

dies für die wöchentliche Versuchen;)

SELECT tmp.dayname, sum(tmp.click) AS click 
FROM 
    (SELECT dayname(`beacon_date_time`) as dayname,COUNT(*) AS click from beaconanalytics WHERE DATE_FORMAT(`beacon_date_time`,'%Y-%m-%d') BETWEEN DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 7 DAY),'%Y-%m-%d') AND DATE_FORMAT(NOW(),'%Y-%m-%d') GROUP by dayname(`beacon_date_time`) 
    UNION 
    SELECT 'Monday' AS dayname, 0 AS click FROM dual 
    UNION 
    SELECT 'Tuesday' AS dayname, 0 AS click FROM dual 
    UNION 
    SELECT 'Wednesday' AS dayname, 0 AS click FROM dual 
    UNION 
    SELECT 'Thursday' AS dayname, 0 AS click FROM dual 
    UNION 
    SELECT 'Friday' AS dayname, 0 AS click FROM dual 
    UNION 
    SELECT 'Saturday' AS dayname, 0 AS click FROM dual 
    UNION 
    SELECT 'Sunday' AS dayname, 0 AS click FROM dual 
) tmp 
GROUP BY tmp.dayname 
+1

Und für monatlich noch mehr wählt. Was, wenn er sich entscheidet, einen jährlichen Bericht oder für ein Jahrzehnt zu machen? : D – akasummer

+0

@akasummer was Sie gesagt haben, ist über die Leistung dieser Abfrage besorgt? -.- – Blank

+1

Was ich gesagt habe, gibt einen Hinweis, dass Ihre Lösung ist definitiv nicht der Weg zu gehen. – akasummer

0

Bitte versuchen Sie es

SELECT days.daynum, IF(count.c IS NULL, 0, count.c) from 
     (
     SELECT t*10+u daynum 
     FROM 
      (SELECT 0 t UNION SELECT 1 UNION SELECT 2 UNION SELECT 3) A, 
      (SELECT 0 u UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 
      UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 
      UNION SELECT 8 UNION SELECT 9) B 
     ORDER BY daynum 
     ) as days 
     LEFT JOIN 
     (
     SELECT DISTINCT(hour(`beacon_date_time`)) as hour,COUNT(*) as c from beaconanalytics WHERE DATE_FORMAT(`beacon_date_time`,'%Y-%m-%d') BETWEEN DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 1 DAY),'%Y-%m-%d') AND DATE_FORMAT(NOW(),'%Y-%m-%d') GROUP by hour(`beacon_date_time`) 
     ) as count ON count.hour = days.daynum ORDER BY days.daynum 
+0

Diese Show 39 Rekord. Vorherige Antwort ist gut für 24 Stunden Rekord. aber jetzt ist die Frage für wöchentliche Daten, wo ich will Sonntag, Montag ... Samstag statt 1,2,3 ..... 24. –

+0

Okay, bitte aktualisieren Sie Ihre Frage auch @SatanandTiwari –

+0

ja ich habe das aktualisiert. –

Verwandte Themen