【问题标题】:How to match row value as variable for parameter in sibling results?如何将行值匹配为兄弟结果中参数的变量?
【发布时间】:2019-09-01 22:40:14
【问题描述】:

我有 2 个 db 调用,它们运行一个循环来获取所有结果。

首先我会得到与当年相关的结果。

第二次我得到了相对于前一年的结果 (-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">&nbsp;</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">&nbsp;</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

【问题讨论】:

    标签: php mysql sql mariadb roots-sage


    【解决方案1】:

    您可能只是过于复杂了。

    可以构建一个 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() 函数。

    【讨论】:

    • 感谢您提供新知识,但这破坏了我用来构建元素的 key/$row 结构。
    • @canacast 您从未在代码中使用过该键,此外,您可以扩展此查询以包括去年的值(year-1),这是此查询中唯一可隐式扣除的信息.请记住,在一般编程中,只要访问相同的information,任何形式都可以转换为任何其他形式。
    【解决方案2】:

    您可以用另一种方式填充数组,以便以某种方式在其中存储月份,如下所示:

    $cargovolume_cy["$terminal-$month-$year"] = 
            '<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">&nbsp;</div>'.
            '<span class="cy-tonnage" value="'.$tonnages.'"> '.$tonnages.' </span></div>'.
            '</div>';
    

    然后,在容器元素中写下这样的内容:

    @foreach ($cargovolumes_cy as $key_1 => $volume_cy)
        @foreach ($cargovolumes_ly as $key_2 => $volume_ly)
            @if (explode('-', $key_1)[1] == explode('-', $key_2)[1])
                <div class="page_cargovolumes-info_grid-cy_item">
                  {!! $volume_cy !!}
                  {!! $volume_ly !!}
                </div>
            @endif
        @endforeach
    @endforeach
    

    【讨论】:

      猜你喜欢
      • 2018-06-05
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      • 2011-04-20
      • 2020-08-24
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      相关资源
      最近更新 更多