2015-06-13 2 views
0

Я хочу создать диаграмму, показывающую «пользовательские логины» приложения каждый день в месяце. Далее я хочу показать их в своих диаграммах в зависимости от их группы (платного или бесплатного пользователя).Графики с ежедневными результатами из базы данных

Проблема: Я получаю все эти пользовательские логины из своей базы данных. К сожалению, есть дни, когда никто (может) не вошел в систему, а затем нет логинов на целый день (также возможно, что только свободные пользователи не смогли войти в систему). Это приведет к набору результатов моего SQL-запроса с отсутствующей датой, что приведет к проблемам с моей диаграммой.

Вместо:

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 
      } 
     ] 
    }; 
}); 

Это как мой график выглядит следующим образом: enter image description here

Обратите внимание на голубую точку (платные пользователи), 12 июня - Он должен быть равен нулю на 12 июня, и он должен быть 20 на 13 июня, но это не так, потому что SQL-запрос даже не вернул эту дату. Как мне это решить?

ответ

1

Вам необходимо найти список дат, например таблицу или что-то, что имеет все даты, которые вы хотите построить. И затем присоединитесь к этому столбцу, чтобы получить количество логинов для каждой даты (используйте IFNULL (login_count, 0), чтобы считать ноль для отсутствующих дат). Таким образом, у вас будет набор записей вместе с датами, для которых счетчик равен нулю.

table_date_lookup (эта таблица будет иметь поиск дат) присоединиться table_botuser_statistics

Edit - 1: -

Создать временную таблицу (или представление) с даты, с сортировкой. Имя Таблица - tbl_dates

~~~~~~~~~
даты
~~~~~~~~~
2015-05-13
2015-05-14
2015- 05-15
~~~~~~~~~

И затем использовать запрос, как показано ниже -

ВЫБОР A.dates, IFNULL (B.logins, 0) ОТ tbl_dates в качестве
LEFT JOIN
(SELECT COUNT (различны (member_id)) в качестве входов в систему, дату (date_seen) ОТ botuser_statistics ГДЕ абонентское = 0 GROUP BY DATE (date_seen)) КАК Б
ПО A.dates = B.date_seen

+0

Haven Я вообще не получил его, как мне нужно изменить свой SQL-запрос, чтобы все даты были там включены? – kentor

+0

Что такое диапазон дат? Это исправлено? Вы знаете это заранее? – nivasan89

+0

Я всегда хочу показать последние 30 дней на этом графике – kentor

Смежные вопросы