【问题标题】:Sum from JSON fields in MySQLMySQL中JSON字段的总和
【发布时间】:2019-10-29 21:45:35
【问题描述】:

这是来自 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 编码

如果你能帮我找到解决办法,谢谢

【问题讨论】:

  • 您是否正在寻找一个 MySQL 解决方案?应该可以编写一个执行计算的 SQL 查询。
  • 另外,请向我们展示您的预期结果。
  • $sumT1 给 110。我开始看清楚了,但我仍然感到困惑......

标签: mysql arrays json sum


【解决方案1】:

在 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_table()(自 MySQL 8.0 起可用)将 json 数组转换为行,然后聚合结果来工作。这将为tax 的每个不同值返回一条记录,以及相关prices 的总数。

demo on DB Fiddle 与您的示例数据返回:

税收 |总价 --: | ----------: 2 | 112 1 | 10

【讨论】:

    【解决方案2】:

    所以我找到了一个解决方案,当然不是最漂亮的,但它确实有效。

    感谢 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;
    

    【讨论】:

      猜你喜欢
      • 2011-02-14
      • 1970-01-01
      • 1970-01-01
      • 2021-01-18
      • 2017-03-03
      • 1970-01-01
      • 1970-01-01
      • 2012-01-04
      • 1970-01-01
      相关资源
      最近更新 更多