| Bug #78117 | JSON aggregate array function | ||
|---|---|---|---|
| Submitted: | 18 Aug 2015 2:32 | Modified: | 31 Aug 2016 7:45 |
| Reporter: | Jesper wisborg Krogh | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | MySQL Server: JSON | Severity: | S4 (Feature request) |
| Version: | 5.7.8 | OS: | Any |
| Assigned to: | CPU Architecture: | Any | |
[18 Aug 2015 2:34]
Jesper wisborg Krogh
Posted by developer: Current workaround is to manually create the JSON object using GROUP_CONCAT.
[31 Aug 2016 7:45]
Jon Stephens
Documented fix in the MySQL 8.0.1 changelog, as follows:
Added two JSON aggregation functions JSON_ARRAYAGG() and JSON_OBJECTAGG(). The
JSON_ARRAYAGG() function takes a column or column expression as an argument, and
aggregates the result set as a single JSON array, as shown here:
mysql> SELECT col FROM t1;
+--------------------------------------+
| col
|
+--------------------------------------+
| {"key1": "value1", "key2": "value2"} |
| {"keyA": "valueA", "keyB": "valueB"} |
+--------------------------------------+
2 rows in set (0.00 sec)
mysql> SELECT JSON_ARRAYAGG(col) FROM t1;
+------------------------------------------------------------------------------+
| JSON_ARRAYAGG(col)
|
+------------------------------------------------------------------------------+
| [{"key1": "value1", "key2": "value2"}, {"keyA": "valueA", "keyB": "valueB"}] |
+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
The order of the array elements is unspecified.
JSON_OBJECTAGG() takes two columns or expressions which it interprets as a key
and a value, respectively; it returns the result as a single JSON object, as
shown here:
mysql> SELECT id, col FROM t1;
+------+--------------------------------------+
| id | col |
+------+--------------------------------------+
| 1 | {"key1": "value1", "key2": "value2"} |
| 2 | {"keyA": "valueA", "keyB": "valueB"} |
+------+--------------------------------------+
2 rows in set (0.00 sec)
mysql> SELECT JSON_OBJECTAGG(id, col) FROM t1;
+----------------------------------------------------------------------------------------+
| JSON_OBJECTAGG(id, col) |
+----------------------------------------------------------------------------------------+
| {"1": {"key1": "value1", "key2": "value2"}, "2": {"keyA": "valueA", "keyB": "valueB"}} |
+----------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
A NULL key causes an error; duplicate keys are ignored.
For more information, see Functions That Create JSON Values. (Bug #78117, Bug #21647417)
Closed.

Description: 5.7.8 added native support for JSON however there are currently no JSON functions that can be used for aggregate queries, for example to create a JSON array from several rows in a table. How to repeat: For example consider the world sample database and assume you want a JSON object with an array for each country and that array has each city for that country with the population, so: { "CountryCode": "AUS", "Cities": [ { "Name": "Sydney", "Population": 3276207 }, { "Name": "Melbourne", "Population": 2865329 }, ... ] }, ... So that would be a query similar to: SELECT JSON_OBJECT( "CountryCode", co.Code, "Cities", JSON_ARRAY_AGGREGATE( JSON_OBJECT( "Name", ci.Name, "Population", ci.Population ) ) ) AS Country FROM world.Country co INNER JOIN world.City ci ON ci.CountryCode = co.Code WHERE co.Continent = 'Oceania' GROUP BY co.Code;