QUERY:
SELECT month(date_created), count(a.ticket_num)
FROM ticket as a
LEFT JOIN user_management as b on b.engineer_id = a.ticket_engineer
WHERE b.tl_id = 'sample_id'
AND year(date_created) = '2019'
GROUP BY extract(year from date_created), extract(month from date_created)
示例输出:
month | ticket_num
----------------------
2 | 12
4 | 24
6 | 78
预期示例输出:
month | ticket_num
----------------------
1 | 0
2 | 12
3 | 0
4 | 24
5 | 0
6 | 78
如您所见,上述预期输出,我尝试将所有现有月份放在第一列中,如果第二列中不存在,则将所有计数设置为零。截至目前,我只有创建票证时存在的按月对票证计数进行排序的查询。
这个问题有不同的方法。例如,一个是纯SQL。
但我会说基于 PHP 的解决方案更简单。基本上,您需要将数据放入数组中,然后创建一个输出所需月份顺序的循环,并有一个条件来查看数组中是否有相应的行,并相应地输出实际数据或零。
唯一棘手的部分是拥有这样一个数组,让我们检查数据可用性。为此,我们必须用月份数字对其进行索引。其实没什么大不了的
$sql = "SELECT month(date_created), count(a.ticket_num) ...";
$res = $mysqli($sql);
$data = [];
while($row = mysqli_fetch_row($res)) {
$data[$row[0]] = $row[1];
}
现在$data
是一个按月份编号索引的数组。其余的是一个原始循环
foreach (range(1,12) as $month) {
echo $data[$month] ?: 0;
}
附带说明一下,我想宣传使用PDO而不是mysqli进行数据库交互,因为这种情况清楚地显示了前者的优越性。使用 PDO,我们可以立即获得索引数组,无需显式循环,这要归功于特殊的获取模式:
$sql = "SELECT month(date_created), count(a.ticket_num) ...";
$data = $data = $pdo->query($sql)->fetchAll(PDO::FETCH_KEY_PAIR);
就这样!