繁体   English   中英

如何对来自 MySQL 的数据进行分组并使其成为多维数组 PHP

[英]How to grouping data from MySQL and make it multi-dimensional array PHP

我在数据库中有一些记录物品库存的数据,我想根据每个物品的月-年对这些数据进行分组。

项目看起来像这样:

item_id | item    |
     1  | item_1  |
     2  | item_2  |
     3  | item_3  |
     4  | item_4  |

对于股票:

stock_id | item_id  |  date       |  amount
    1    | 1        |  2022-03-01 |  100
    2    | 2        |  2022-03-01 |  120
    3    | 3        |  2022-03-01 |  100
    4    | 4        |  2022-03-01 |  400
    5    | 1        |  2022-04-01 |  100
    6    | 2        |  2022-04-01 |  120
    7    | 3        |  2022-04-01 |  100
    8    | 4        |  2022-04-01 |  400
...

我需要实现的是这样的:

$data = [
    [
      'y' => '03',
      '1' => 100,
      '2' => 120,
      '3' => 100,
      '4' => 400
    ],
    [
      'y' => '04',
      '1' => 100,
      '2' => 120,
      '3' => 100,
      '4' => 400
    ],
];
...

到目前为止我尝试过的一个简单查询:

SELECT MONTH(date) as Month, SUM(amount) as Amount, item
FROM stocks as s
LEFT JOIN items as i
ON s.item_id = i.item_id
GROUP BY s.id_item, MONTH(date)
ORDER BY MONTH(date) ASC

DB小提琴

如何按月对数据进行分组并汇总month sum项目的数量?

更新的 PHP 片段

$StockData = [];

foreach ( $StockModel->stockMonthly()->getResult() as $stock )
{
    $StockData[] = [
        'y' => $stock->Month
    ];

    for ( $i = 0; $i < count($StockData); $i++ )
    {
        if ( $StockData[$i]['y'] === $stock->Month)
        {
            array_push($StockData[$i], [$stock->item => $stock->Amount]);
        }
    }
}

我不知道如何将数据grouping到同month

很高兴看到一个可重现的例子。 为此,您可以在关联数组中收集月份键上的所有项目 ID,然后使用array_merge在顶部添加月份的单个条目,如下所示:

<?php

$StockData = [];

foreach ( $StockModel->stockMonthly()->getResult() as $stock ){
    $StockData[ $stock->Month ] = $StockData[ $stock->Month ] ?? [];
    $StockData[ $stock->Month ][ $stock->item ] = $stock->Amount;
}

$result = [];

foreach($StockData as $month => $monthlyData){
    $result[] = array_merge(['y' => $month], $monthlyData);   
}

print_r($result);

您可以使用以下查询:

select right(concat('0',month(`date`)),2) as "y", 
  sum(if (item_id=1,amount, null)) as "1",
  sum(if (item_id=2,amount, null)) as "2",
  sum(if (item_id=3,amount, null)) as "3",
  sum(if (item_id=4,amount, null)) as "4"
from stocks
group by right(concat('0',month(`date`)),2)

如果您有可变数量的 item_id,最好通过直接数据查询在 PHP 中构建数组。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM