我想在每月的每一天创建一个显示应用程序“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
}
]
};
});
这就是我的图表的样子:
注意6月12日的蓝点(付费用户) - 它应该在6月12日为零,并且应该在6月13日为20但不是,因为SQL查询甚至没有返回那个日期。我该怎么解决这个问题?
答案 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