我想创建一个图表,显示一个月中每天的应用程序的“用户登录”。此外,我想根据他们的用户组(付费或免费用户)在图表中显示它们。
问题:我从数据库中获得了所有这些用户登录名。不幸的是,有几天没有人(可以)登录,然后整天没有登录(也有可能只有免费用户无法登录)。这将导致我的SQL查询的结果集缺少日期,这将导致我的Chart出现问题。
代替:
2015-06-11: 50
2015-06-12: 0
2015-06-13: 108
我会得到:
2015-06-11: 50
2015-06-13: 108
我的data.php执行SQL查询:
$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
}
]
};
});
这是我的图表的样子:
请注意,6月12日的蓝点(付费用户)-6月12日应为零,6月13日应为20,但不是,因为SQL查询甚至没有返回该日期。我应该如何解决呢?
您需要查找日期列表,例如表格或包含要绘制的所有日期的日期。然后,加入该列以获取每个日期的登录计数(使用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)来自tbl_dates作为
左联接
(SELECT count(distinct(member_id))作为登录名,DATE(date_seen)来自botuser_statistics,其中Subscriber = 0 GROUP BY DATE(date_seen))AS B
ON A.dates = B.date_seen
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句