用多个索引汇总mysql json对象

时间:2018-11-14 11:57:58

标签: php mysql json laravel

从数据库中选择json数据时,我遇到了一个问题。 有没有一种方法可以按索引提取数据索引。

我需要这个,因为我想对json项的名称进行求和和分组,如果我使用以下方法从数组中提取第一个项,则可以实现此目的:

DB::raw('JSON_UNQUOTE(JSON_EXTRACT(resources, "$[0].name[0]")) as brand_name'), 
DB::raw('JSON_UNQUOTE(JSON_EXTRACT(resources, "$[0].brand_id[0]")) as brand_id'),
DB::raw('SUM(JSON_EXTRACT(resources, "$[0].quantity[0]")) as quantity')

然后我将$ [0] .name [0]分组,得到唯一的结果。

存储在sql中的数据:

[[{\"name\": \"Product 1\", \"brand_id\": \"2\", \"quantity\": 2}, 
{\"name\": \"Product 2\", \"brand_id\": \"3\", \"quantity\": 1}], 

[{\"name\": \"Product 3\", \"brand_id\": \"1\", \"quantity\": 2}, 
{\"name\": \"Product 1\", \"brand_id\": \"2\", \"quantity\": 5}], 

[{\"name\": \"Product 4\", \"brand_id\": \"4\", \"quantity\": 2}, 
{\"name\": \"Product 5\", \"brand_id\": \"5\", \"quantity\": 5}]]

如果您理解我的意思,我应该对所有具有相同名称的产品的数量求和,并获得唯一的响应,而不是多个具有相同名称的产品。 例如,应该只有一个

产品1,总数量为7。

1 个答案:

答案 0 :(得分:0)

假设您可以获取原始的JSON字符串:

$rawjson = '[[{\"name\":\"Product 1\",\"brand_id\": \"2\",\"quantity\": 2},{\"name\":\"Product 2\",\"brand_id\": \"3\",\"quantity\": 1}],[{\"name\": \"Product 3\", \"brand_id\": \"1\",\"quantity\": 2},{\"name\": \"Product 1\", \"brand_id\": \"2\", \"quantity\": 5}],[{\"name\": \"Product 4\", \"brand_id\": \"4\",\"quantity\": 2},{\"name\": \"Product 5\", \"brand_id\": \"5\",\"quantity\": 5}]]';

$master = json_decode(stripslashes($rawjson), true);

$p1Sum = 0;
$p2Sum = 0;
$p3Sum = 0;
$p4Sum = 0;

foreach ($master as $subitems) {
    foreach ($subitems as $item) {
      $itemName = $item['name'];
      switch($itemName){
      case 'Product 1':
        $p1Sum += $item['quantity'];
        break;
       case 'Product 2':
        $p2Sum += $item['quantity'];
        break;
       case 'Product 3':
         $p3Sum += $item['quantity'];
         break;
       case 'Product 4':
         $p4Sum += $item['quantity'];
         break;
      }

    }
}

echo 'Product 1: ' . $p1Sum . "\r\n";
echo 'Product 2: ' . $p2Sum . "\r\n";
echo 'Product 3: ' . $p3Sum . "\r\n";
echo 'Product 4: ' . $p4Sum . "\r\n";

会给你:

Product 1: 7
Product 2: 1
Product 3: 2
Product 4: 2