Php 从数据库获取每日销售额-无销售额天数应显示0-最近30天的销售额
我需要为过去30天的销售额创建一个统计图表。有些日子没有销售,所以这些日子我必须显示0 MySQLPhp 从数据库获取每日销售额-无销售额天数应显示0-最近30天的销售额,php,mysql,datetime,Php,Mysql,Datetime,我需要为过去30天的销售额创建一个统计图表。有些日子没有销售,所以这些日子我必须显示0 MySQL SELECT COUNT(*) as total, DAY(FROM_UNIXTIME(tmstmp)) AS soldDay FROM tl_voucher_create WHERE sold = 1 GROUP BY soldDay ORDER BY tmstmp DESC 0,30 结果的PHP数组 Array ( [0] => Array (
SELECT COUNT(*) as total, DAY(FROM_UNIXTIME(tmstmp)) AS soldDay
FROM tl_voucher_create
WHERE sold = 1
GROUP BY soldDay
ORDER BY tmstmp DESC 0,30
结果的PHP数组
Array
(
[0] => Array
(
[total] => 1
[soldDay] => 24
)
[1] => Array
(
[total] => 1
[soldDay] => 13
)
[2] => Array
(
[total] => 4
[soldDay] => 3
)
[3] => Array
(
[total] => 2
[soldDay] => 23
)
使用循环,我将值放入一个新数组:
for ($x = $day; $x < 31; $x++) {
if (isset($this->_["soldDaily"][$x]["soldDay"])) {
$total[$x] = $this->_["soldDaily"][$x]["total"];
} else {
$total[$x] = 0;
}
}
for($x=$day;$x<31;$x++){
如果(isset($this->[“soldDay”][$x][“soldDay”])){
$total[$x]=$this->[“solddayy”][$x][“total”];
}否则{
$total[$x]=0;
}
}
如何以正确的顺序将过去30天的值进行正确的输出
提前感谢根据实际日期查询:
SELECT COUNT(*) AS total, DATE(FROM_UNIXTIME(tmstmp)) AS sold_date
FROM tl_voucher_create
WHERE sold = 1
AND sold_date BETWEEN DATE(NOW() - INTERVAL 30 DAY) AND CURDATE()
GROUP BY sold_date
ORDER BY sold_date DESC
假设查询结果如下所示:
$data = [
[
'total' => 7,
'sold_date' => '2017-02-28'
],
[
'total' => 19,
'sold_date' => '2017-02-27'
],
[
'total' => 8,
'sold_date' => '2017-02-24'
],
[
'total' => 5,
'sold_date' => '2017-02-22'
],
[
'total' => 12,
'sold_date' => '2017-02-21'
]
];
您现在需要将PHP基于实际的日期对象,而不仅仅是一个数字30的迭代循环,否则您将在报告中遇到各种问题和不准确之处,因为日期并不像从1循环到30那么简单(月份有不同的天数,您无法轻松跨回上一个月,夏令时问题、不同时区的日期等)
//按日期组织阵列
$dates=[];
foreach($day数据){
$dates[$day['salled_date']=$day['total'];
}
//循环过去30天,并将每次迭代与数据匹配
$d=新的日期时间();
对于($i=0;$i<30;$i++){
$date=$d->format('Y-m-d');
//如果指定日期没有数据,请使用零
$total=isset($dates[$date])?$dates[$date]:0;
回音“”。$total.。于“$date”售出。”;
$d->修改('-1天');
}
太好了!谢谢!!
// Organise the array by date
$dates = [];
foreach ($data as $day) {
$dates[$day['sold_date']] = $day['total'];
}
// Loop through the last 30 days and match each iteration with the data
$d = new DateTime();
for ($i = 0; $i < 30; $i++) {
$date = $d->format('Y-m-d');
// If there's no data for the specified date, use zero
$total = isset($dates[$date]) ? $dates[$date] : 0;
echo '<p>' . $total . ' sold on ' . $date . '</p>';
$d->modify('-1 day');
}