如何按 mysql 中 json 数据类型列中的键进行分组
How to group by a key in json datatype column in mysql
我的 orders
table,
中的 JSON 列 order_summary
具有以下结构
//Order 1
{
"total": 16.895,
.....
"products": [
{
...,
"quantity": 2,
"variant_id": 98
},
{
...,
"quantity": 3,
"variant_id": 99
},
],
}
//Order 2
{
"total": 10.895,
.....
"products": [
{
...,
"quantity": 2,
"variant_id": 98
},
{
...,
"quantity": 4,
"variant_id": 100
},
],
}
现在我需要找到每个 variant_id
的总售出数量
我正在看类似下面的内容
SELECT sum(order_summary->"$.products[*].quantity")
FROM orders
GROUP BY order_summary->"$.products[*].variant_id"
但我只得到零。非常感谢任何帮助。
order_summary->"$.products[*].quantity"
结果是一个数组。
mysql> SELECT order_summary->"$.products[*].quantity" from orders;
+-----------------------------------------+
| order_summary->"$.products[*].quantity" |
+-----------------------------------------+
| [2, 3] |
| [2, 4] |
+-----------------------------------------+
总和为0
mysql> select sum("[2,3]");
+--------------+
| sum("[2,3]") |
+--------------+
| 0 |
+--------------+
要完成这项工作,首先您必须使用 json_table
将 JSON 转换为行。然后它们可以像普通列一样聚合。
select products.*
from orders,
json_table(
-- select the JSON column from orders
orders.order_summary,
-- filter only the products
"$.products[*]"
-- translate them into columns
columns(
quantity int path "$.quantity",
variant_id int path "$.variant_id"
)
) products
;
+----------+------------+
| quantity | variant_id |
+----------+------------+
| 2 | 98 |
| 3 | 99 |
| 2 | 98 |
| 4 | 100 |
+----------+------------+
然后我们就可以正常操作products
伪table了
select products.variant_id, sum(products.quantity)
from orders,
json_table(
order_summary,
"$.products[*]"
columns(
quantity int path "$.quantity",
variant_id int path "$.variant_id"
)
) products
group by products.variant_id;
+------------+------------------------+
| variant_id | sum(products.quantity) |
+------------+------------------------+
| 98 | 4 |
| 99 | 3 |
| 100 | 4 |
+------------+------------------------+
我的 orders
table,
order_summary
具有以下结构
//Order 1
{
"total": 16.895,
.....
"products": [
{
...,
"quantity": 2,
"variant_id": 98
},
{
...,
"quantity": 3,
"variant_id": 99
},
],
}
//Order 2
{
"total": 10.895,
.....
"products": [
{
...,
"quantity": 2,
"variant_id": 98
},
{
...,
"quantity": 4,
"variant_id": 100
},
],
}
现在我需要找到每个 variant_id
我正在看类似下面的内容
SELECT sum(order_summary->"$.products[*].quantity")
FROM orders
GROUP BY order_summary->"$.products[*].variant_id"
但我只得到零。非常感谢任何帮助。
order_summary->"$.products[*].quantity"
结果是一个数组。
mysql> SELECT order_summary->"$.products[*].quantity" from orders;
+-----------------------------------------+
| order_summary->"$.products[*].quantity" |
+-----------------------------------------+
| [2, 3] |
| [2, 4] |
+-----------------------------------------+
总和为0
mysql> select sum("[2,3]");
+--------------+
| sum("[2,3]") |
+--------------+
| 0 |
+--------------+
要完成这项工作,首先您必须使用 json_table
将 JSON 转换为行。然后它们可以像普通列一样聚合。
select products.*
from orders,
json_table(
-- select the JSON column from orders
orders.order_summary,
-- filter only the products
"$.products[*]"
-- translate them into columns
columns(
quantity int path "$.quantity",
variant_id int path "$.variant_id"
)
) products
;
+----------+------------+
| quantity | variant_id |
+----------+------------+
| 2 | 98 |
| 3 | 99 |
| 2 | 98 |
| 4 | 100 |
+----------+------------+
然后我们就可以正常操作products
伪table了
select products.variant_id, sum(products.quantity)
from orders,
json_table(
order_summary,
"$.products[*]"
columns(
quantity int path "$.quantity",
variant_id int path "$.variant_id"
)
) products
group by products.variant_id;
+------------+------------------------+
| variant_id | sum(products.quantity) |
+------------+------------------------+
| 98 | 4 |
| 99 | 3 |
| 100 | 4 |
+------------+------------------------+