I have this json strings
[{\"count\": 9, \"name\": \"fixkit\", \"label\": \"Repair Kit\"}, {\"count\": 1, \"name\": \"phone\", \"label\": \"Telefoon\"}]
[{\"coun
If you are running MySQL 8.0, you can unnest the arrays into rows with json_table(), then filter on the name
s you are interested in, and aggregate.
Assuming that your table is mytable
and that the json column is called js
, that would be:
select j.name, sum(j.cnt) cnt
from mytable t
cross join json_table (
t.js,
'$[*]' columns(
cnt int path '$.count',
name varchar(50) path '$.name'
)
) j
where j.name in ('phone', 'fixkit')
group by j.name
Demo on DB Fiddle:
| name | cnt |
| ------ | --- |
| fixkit | 9 |
| phone | 16 |
If you're not using MySQL 8, this is a bit more complicated. First you have to find a path to a name
element that has the value phone
(or fixkit
); then you can replace name
in that path with count
and extract the count
field from that path; these values can then be summed:
SELECT param, SUM(JSON_EXTRACT(counts, REPLACE(JSON_UNQUOTE(JSON_SEARCH(counts, 'one', param, NULL, '$[*].name')), 'name', 'count'))) AS count
FROM data
CROSS JOIN (
SELECT 'phone' AS param
UNION ALL
SELECT 'fixkit'
) params
WHERE JSON_SEARCH(counts, 'one', param, NULL, '$[*].name') IS NOT NULL
GROUP BY param
Output:
param count
fixkit 9
phone 16
Demo on dbfiddle