我有2个运行循环以获取所有结果的数据库调用。
首先,我要获得相对于当年的结果。
其次,我得到的结果相对于上一年(-1)。
如何将第二个循环的输出中的月份与第一个循环中的同一月对齐?
public function cargovolumes_cy() {
global $wpdb;
$cargodb = new $wpdb('root', 'devpw', 'exdb', 'localhost');
$currentmonthtxt = date('M');
$currentyear = date('Y');
$cargovolume_cy = array();
foreach($cargodb->get_results(
"
SELECT *, SUM(tonneCount)
FROM volumes
WHERE year = $currentyear
GROUP BY terminal, year, month
ORDER BY month desc, year desc
"
) as $key => $row) {
$tonnages = $row->tonneCount;
$terminal = $row->terminal;
$year = $row->year;
$month = $row->month;
$cargovolume_cy[] =
'<h4 class="cv-terminal-title">'.$terminal.' </h4>'.
'<div class="cargovolumes_cy">'.
'<div class="cargovolumes_cy-dates cvrow-'.$month.'-'.$year.'">'.
'<span class="cy-month"> '.$month.' </span>'.
'<span class="cy-year"> '.$year.' </span></div>'.
'<div class="cy-year-bar"><div class="cy-tonnage-bar"> </div>'.
'<span class="cy-tonnage" value="'.$tonnages.'"> '.$tonnages.' </span></div>'.
'</div>';
};
return $cargovolume_cy;
}
public function cargovolumes_ly() {
global $wpdb;
$cargodb = new $wpdb('root', 'devpw', 'exdb', 'localhost');
// $stable = $shipdb->get_results("SELECT * FROM volumes", ARRAY_A);
$currentmonthtxt = date('M');
$currentyear = date('Y');
$cargovolume_ly = array();
foreach($cargodb->get_results(
"
SELECT *, SUM(tonneCount)
FROM volumes
WHERE year = $currentyear -1
GROUP BY terminal, year, month
ORDER BY month desc, year desc
"
) as $key => $row) {
$tonnages = $row->tonneCount;
$terminal = $row->terminal;
$year = $row->year;
$month = $row->month;
$cargovolume_ly[] =
'<div class="cargovolumes_ly">'.
'<div class="cargovolumes_ly-dates">'.
'<span class="ly-month"> '.$month.' </span>'.
'<span class="ly-year"> '.$year.' </span></div>'.
'<div class="ly-year-bar"><div class="ly-tonnage-bar"> </div>'.
'<span class="ly-tonnage" value="'.$tonnages.'"> '.$tonnages.' </span></div>'.
'</div>';
};
return $cargovolume_ly;
}
结果应输出2个元素,它们具有匹配的月份和年份。相反,我在第一个输出中得到了最近的一个月,在第二个输出中得到了一年中的最后一个月。
以下是容器元素:
@for ($i = 0; $i < min(count($cargovolumes_cy), count($cargovolumes_ly)); $i++)
<div class="page_cargovolumes-info_grid-cy_item">
{!! $cargovolumes_cy[$i] !!}
{!! $cargovolumes_ly[$i] !!}
</div>
@endfor
最佳答案
您可能只是将其复杂化了。
可以构建一个SQL查询来在每个终端和每个月生成一个记录,而不用一个接一个地运行两个sql查询,而将今年和去年的卷总和分成两个单独的列。这被称为条件聚集。
考虑:
SELECT
terminal,
month,
SUM(CASE WHEN year = YEAR(CURDATE()) THEN tonneCount ELSE 0 END) tonnage_cy,
SUM(CASE WHEN year = YEAR(CURDATE()) - 1 THEN tonneCount ELSE 0 END) tonnage_ly
FROM volumes
WHERE year >= YEAR(CURDATE()) - 1
GROUP BY terminal, month
ORDER BY month desc
注意:
SELECT *
和GROUP BY
并不是一个好习惯,并且可能会在非古老的MySQL版本中产生错误。您最好显式列出要返回的列(并将所有未聚合的列添加到GROUP BY
子句中),如上面的SQL所示您可以直接使用
YEAR(CURDATE())
从sql计算当前年份,而不是使用PHP的date()
函数。