Суммирование объектов MySQL JSON с несколькими индексами - PullRequest
0 голосов
/ 14 ноября 2018

При выборе данных 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}]]

Iследует суммировать количество всех товаров с одинаковым названием и получить уникальный ответ, а не несколько товаров с одинаковым именем, если вы понимаете, о чем я говорю.Например, должен быть только один

Продукт 1 с суммарным количеством 7.

1 Ответ

0 голосов
/ 14 ноября 2018

Предполагая, что вы можете получить необработанную строку 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...