can*_*ast 5 php mysql sql mariadb roots-sage
我有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查询,而不是一个接一个地运行两个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())而不是PHP date()函数来计算当前年份。| 归档时间: | 
 | 
| 查看次数: | 218 次 | 
| 最近记录: |