Сумма из полей JSON в MySQL - PullRequest
       3

Сумма из полей JSON в MySQL

0 голосов
/ 30 октября 2019

вот небольшая партия записей из MySQL 8 с полем JSON

id, cmd_json, reg_day
(
    1,
    '[
        {"id": 1, "qty": 1, "tax": 2, "ref": "art 1", "price": 100},
        {"id": 2, "qty": 1, "tax": 1, "ref": "art 2", "price": 10}
    ]',
    '2019-10-29'
),
(
    2,
    '[
        {"id": 1, "qty": 1, "tax": 2, "ref": "art 3", "price": 12}
    ]',
    '2019-10-29'
);

Я хочу получить суммы записей с налогом 1 и налогом 2

Вот мойподход, но результат неправильный

$q_t1s = Model::where('reg_day', $date)->where('cmd_json', 'like', '%"tax": 1%')->get();
$sumT1 = 0;
foreach ($q_t1s as $q_t1):
    $t1s = $q_t1->cmd_json;
    foreach ($t1s as $t1):
        $sumT1 += ($t1['qty'] * $t1['price']);
    endforeach;
endforeach;
dd($sumT1);

Я кодирую с Laravel 6

Если вы можете помочь мне найти решение, спасибо

Ответы [ 2 ]

0 голосов
/ 30 октября 2019

Итак, я нашел решение, конечно, не самое красивое, но оно работает.

Спасибо GMB за ваше решение MySQL, но я не знаю, как интегрировать его в Laravel: /

$req_days = Model::where('reg_day', $date)->get();

if (count($req_days) > 0):
    $sum_tax_1 = 0;
    $sum_tax_2 = 0;
    foreach ($req_days as $req_day):
        $req_taxs = $req_day->cmd_json;
        foreach ($req_taxs as $req_tax):
            if ($req_tax['tax'] === 1):
                $sum_tax_1 += ($req_tax['qty'] * $req_tax['price']);
            elseif($req_tax['tax'] === 2):
                $sum_tax_2 += ($req_tax['qty'] * $req_tax['price']);
            endif;
        endforeach;
    endforeach;
    dd($sum_tax_1, $sum_tax_2);
    // RESULTS ARE OK
else:
    $noCash = '<h1 class="text-center text-warning">No cash this day</h1>';
endif;
0 голосов
/ 30 октября 2019

В MySQL 8.0 можно выполнять вычисления непосредственно в базе данных. Вот необработанный SQL-запрос для этой цели:

select tax, sum(price) total_price
from 
    mytable t,
    json_table(
        cmd_json,
        "$[*]"
        columns(
            id int path "$.id",
            qty int path "$.qty",
            tax int path "$.tax",
            ref varchar(10) path "$.ref",
            price int path "$.price"
        )
    ) d
group by tax

Это работает путем преобразования массивов json в строки, используя функцию json json_table() (доступно с MySQL 8.0), а затем агрегирует результаты. Это вернет одну запись для каждого отдельного значения tax вместе с общей суммой связанных price с.

Это демонстрация на DB Fiddle с вашимПример возвращаемых данных:

tax | total_price
--: | ----------:
  2 |         112
  1 |          10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...