I have this json strings
[{"count": 9, "name": "fixkit", "label": "Repair Kit"}, {"count": 1, "name": "phone", "label": "Telefoon"}] [{"count": 3, "name": "phone", "label": "Telefoon"}] [{"count": 5, "name": "kunststof", "label": "Kunststof"}, {"count": 6, "name": "papier", "label": "Papier"}, {"count": 2, "name": "metaal", "label": "Metaal"}, {"count": 2, "name": "inkt", "label": "Inkt"}, {"count": 3, "name": "kabels", "label": "Kabels"}, {"count": 2, "name": "klei", "label": "Klei"}, {"count": 2, "name": "glas", "label": "Glas"}, {"count": 12, "name": "phone", "label": "Telefoon"}] [{"count": 77, "name": "weed", "label": "Cannabis"}, {"count": 1, "name": "firework1", "label": "Vuurpijl 1"}]
And know i want the following output
Phone | Number of phones (in this case: 16) Fixkit | Number of fixkits (in this case: 9)
I wanted to do this with a sql query. If you know how to do this, thanks in advance!
Advertisement
Answer
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