Php 从包含零计数的查询中获取所有月份

Php 从包含零计数的查询中获取所有月份,php,mysql,sql,datetime,mysqli,Php,Mysql,Sql,Datetime,Mysqli,我现在有一个问题: 选择日期\格式为'dataNl',\'%Y%m\'为'Ym',计数*为'totale'` 来自诺莱乔` 按“Ym”分组` 这有助于获取每个月的数据,但如果一个月的值为0,则该值在数据库中不存在,因此我无法获取它。我需要一个添加剩余月份的查询,将计数字段设置为0 我编写了一个PHP代码,将值为0的月份添加到数组中,但它只在一年内有效,如果我想获得更多,这需要很多复杂的代码,我认为可以使用SQL解决 这是PHP代码: $t = array(); $m = array(); for

我现在有一个问题:

选择日期\格式为'dataNl',\'%Y%m\'为'Ym',计数*为'totale'` 来自诺莱乔` 按“Ym”分组` 这有助于获取每个月的数据,但如果一个月的值为0,则该值在数据库中不存在,因此我无法获取它。我需要一个添加剩余月份的查询,将计数字段设置为0

我编写了一个PHP代码,将值为0的月份添加到数组中,但它只在一年内有效,如果我想获得更多,这需要很多复杂的代码,我认为可以使用SQL解决

这是PHP代码:

$t = array();
$m = array();
foreach ($months as $val) {
    $t[] = $val['totale'];
    $m[] = $val['Ym'];
}

for ($i = 0; $i < 12; ++$i) {
    if (in_array($i + 201801, $m) == false) {
        array_splice($t, $i, 0, 0);
    }
}
请尝试以下查询:

SELECT DATE_FORMAT(`dataNl`, \'%Y%m\') AS `Ym`, COUNT(*) AS `totale`
FROM `noleggio`
GROUP BY MONTH(`dataNl`)

以下是一个PHP解决方案,它需要数据库中的最小和最大日期:

// use the query SELECT MIN(dataNl), MAX(dataNl) FROM ... to
// find the first and last date in your data and use them below
$dates = new DatePeriod(
    DateTime::createFromFormat('Y-m-d|', '2018-01-15')->modify('first day of this month'),
    new DateInterval('P1M'),
    DateTime::createFromFormat('Y-m-d|', '2018-12-15')->modify('first day of next month')
);

// assuming $rows contain the result of the GROUP BY query...
foreach ($dates as $date) {
    $datestr = $date->format('Ym');
    $index = array_search($datestr, array_column($rows, 'Ym'));
    if ($index === false) {
        echo $datestr . ' -> 0' . PHP_EOL;
    } else {
        echo $datestr . ' -> ' . $months[$index]['totale'] . PHP_EOL;
    }
}

在count>=0的查询中添加having子句。您需要一个日历表。如果你用谷歌搜索它,有很多例子说明如何制作和使用它Month@RevathiGanesh我尝试过,但没有创建一个包含所有需要月份的月份帮助表。外部连接表。我只得到表中最后一个元素database@L.Antonelli我已经更新了答案。请尝试更新的代码。现在我得到的结果与我的查询相同,只有现有的月份。我认为分组对我没有帮助,因为我需要从头开始创建不存在的月份。我的db的日期为2018年1月12日、2018年1月15日、2018年3月22日,2个月不存在,那么我如何获得该日期?