Получите данные за последние 12 месяцев, сгруппированные по месяцам, даже если 0 - PullRequest
0 голосов
/ 30 мая 2020

Я пытаюсь получить COUNT за последние 12 месяцев встреч, сгруппированных по месяцам, для вывода в диаграмму. Следующее работает нормально, но мне нужно, чтобы он возвращал 0, если нет результатов за каждый месяц.

$query = "SELECT COUNT(id) as total_month FROM appointments WHERE created >= DATE(NOW()) - INTERVAL 365 DAY GROUP BY Month(created)";
    $query = $mysqli->real_escape_string($query);
      if($result = $mysqli->query($query)){
        while($row = $result->fetch_array())
          {
          $month_total_appointments .= $row['total_month'].',';
        }
      } 

echo $month_total_appointments;


================================================================
    Simple table structure and example for appointments Table
    id    customer_name    created

    1     John             2020-05-01 08:00:00 <= stored as datetime
    2     Mike             2020-04-01 09:00:00
    3     Steve            2020-02-01 10:00:00

    Output would be 0,0,0,0,0,0,0,0,1,0,1,1 
======================================================

Текущий результат: 1,1,1

Я читал, что некоторые используют месяц table и LEFT JOIN, но все, что я пробовал, похоже, не работает. Кто-нибудь может помочь, пожалуйста?

1 Ответ

0 голосов
/ 30 мая 2020

Вы не получите нулей для строк, которых нет. Группировка объединяет строки, соответствующие определенным критериям, но не может создать их из ничего.

Вот почему обычно включают критерии группировки в результаты:

SELECT COUNT(id), MONTH(created) AS created_month
  FROM appointments
  WHERE created >= DATE(NOW()) - INTERVAL 365 DAY
  GROUP BY created_month

Тогда вы можете разверните это в коде приложения, чтобы заполнить недостающие значения. В качестве альтернативы вам понадобится полностью заполненный список всех возможных дат до JOIN против.

Имейте в виду, что MONTH() будет объединяться и сгруппировать январь 2020 года и январь 2021 года. Вы можете разделить его. вверх:

SELECT COUNT(id), YEAR(created) AS created_year, MONTH(created) AS created_month
  FROM appointments
  WHERE created >= DATE(NOW()) - INTERVAL 365 DAY
  GROUP BY created_year, created_month
...