图表包含数据库的每日结果

时间:2015-06-13 10:11:11

标签: javascript php mysql json charts

我想在每月的每一天创建一个显示应用程序“userlogins”的图表。此外,我想在我的图表中显示它们,具体取决于用户组(付费或免费用户)。

问题:我从我的数据库中获取所有这些用户登录。不幸的是,有些日子没有人(可以)登录,然后一整天都没有登录(也可能只有免费用户无法登录)。这会导致我的SQL查询的结果集缺少日期,这会导致我的图表出现问题。

而不是:

2015-06-11: 50
2015-06-12: 0
2015-06-13: 108

我会得到:

2015-06-11: 50
2015-06-13: 108

我执行SQL查询的data.php:

$sql = "SELECT count(distinct(member_id)) as logins, DATE(date_seen) FROM botuser_statistics WHERE subscriber=0 GROUP BY DATE(date_seen)";
$rows = $db->query($sql);

$logins = array();
$logins["type"]["dates"] = array();
$logins["type"]["logins"] = array();

foreach($rows as $row){
    $logins["free"]["dates"][] = $row['DATE(date_seen)'];
    $logins["free"]["logins"][] = $row['logins'];
}

$sql = "SELECT count(distinct(member_id)) as logins, DATE(date_seen) FROM botuser_statistics WHERE subscriber=1 GROUP BY DATE(date_seen)";
$rows = $db->query($sql);

foreach($rows as $row){
    $logins["paid"]["dates"][] = $row['DATE(date_seen)'];
    $logins["paid"]["logins"][] = $row['logins'];
}
echo json_encode($logins);

这是我绘制图表的JavaScript:

jQuery.getJSON("data.php", function (result) {
    datesfree = result["free"]["dates"];
    loginsfree = result["free"]["logins"];
    loginspaid = result["paid"]["logins"];

    // Get context with jQuery - using jQuery's .get() method.
    var ctx = $("#userlogins").get(0).getContext("2d");

    var data = {
        labels: datesfree,
        datasets: [
            {
                label: "Free Users",
                fillColor: "rgba(220,220,220,0.2)",
                strokeColor: "rgba(220,220,220,1)",
                pointColor: "rgba(220,220,220,1)",
                pointStrokeColor: "#fff",
                pointHighlightFill: "#fff",
                pointHighlightStroke: "rgba(220,220,220,1)",
                data: loginsfree
            },
            {
                label: "Paid Users",
                fillColor: "rgba(151,187,205,0.2)",
                strokeColor: "rgba(151,187,205,1)",
                pointColor: "rgba(151,187,205,1)",
                pointStrokeColor: "#fff",
                pointHighlightFill: "#fff",
                pointHighlightStroke: "rgba(151,187,205,1)",
                data: loginspaid
            }
        ]
    };
});

这就是我的图表的样子:enter image description here

注意6月12日的蓝点(付费用户) - 它应该在6月12日为零,并且应该在6月13日为20但不是,因为SQL查询甚至没有返回那个日期。我该怎么解决这个问题?

1 个答案:

答案 0 :(得分:1)

您需要查找日期列表,例如表格或具有您要绘制的所有日期的内容。然后,加入该列以获取每个日期的登录计数(使用IFNULL(login_count,0)将缺少的日期视为零)。这样,您将拥有记录集以及计数为零的日期。

table_date_lookup(此表将查找日期) 加入 table_botuser_statistics

编辑 - 1: -

创建一个列出日期的临时表(或视图)。 表名 - tbl_dates

~~~~~~~~~
日期
~~~~~~~~~
2015年5月13日
2015年5月14日
2015年5月15日
~~~~~~~~~

然后使用类似下面的查询 -

SELECT A.dates,IFNULL(B.logins,0)FROM tbl_dates AS A LEFT JOIN
(SELECT count(distinct(member_id))作为登录名,DATE(date_seen)FROM botuser_statistics WHERE subscriber = 0 GROUP BY DATE(date_seen))AS B
ON A.dates = B.date_seen