MySQL inkluderar en aggregatfunktion som heter JSON_OBJECTAGG()
. Med den här funktionen kan du skapa ett JSON-objekt som innehåller nyckel-värdepar. Mer specifikt låter den dig skapa detta JSON-objekt baserat på resultaten av en fråga.
Den accepterar två argument, det första av dessa används som en nyckel och det andra som ett värde. Dessa argument kan vara kolumnnamn eller uttryck.
Syntax
Syntaxen ser ut så här:
JSON_OBJECTAGG(key, value)
Där key
är kolumnen eller uttrycket som representerar nyckeln av nyckel/värdeparet och value
är kolumnen eller uttrycket som representerar värdet av nyckel/värdeparet.
Exempel
Här är ett exempel att visa.
Här är en vanlig fråga som vi kan köra utan JSON_OBJECTAGG()
funktion:
SELECT District AS 'State', Name AS 'City', Population FROM City WHERE CountryCode = 'AUS' ORDER BY State;
Resultat:
+-----------------+---------------+------------+ | State | City | Population | +-----------------+---------------+------------+ | Capital Region | Canberra | 322723 | | New South Wales | Sydney | 3276207 | | New South Wales | Newcastle | 270324 | | New South Wales | Central Coast | 227657 | | New South Wales | Wollongong | 219761 | | Queensland | Brisbane | 1291117 | | Queensland | Gold Coast | 311932 | | Queensland | Townsville | 109914 | | Queensland | Cairns | 92273 | | South Australia | Adelaide | 978100 | | Tasmania | Hobart | 126118 | | Victoria | Melbourne | 2865329 | | Victoria | Geelong | 125382 | | West Australia | Perth | 1096829 | +-----------------+---------------+------------+
Vi kan justera den frågan så att Name
kolumn (i det här exemplet har vi gett den här kolumnen ett alias för City
) blir en nyckel, och Population
kolumnen blir ett värde.
Vi använder också en GROUP BY
sats för att gruppera resultaten efter District
kolumn (i det här fallet har vi skapat ett alias för denna kolumn som heter State
).
SELECT District AS 'State', JSON_OBJECTAGG(Name, Population) AS 'City/Population' FROM City WHERE CountryCode = 'AUS' GROUP BY State;
Resultat:
+-----------------+-----------------------------------------------------------------------------------------+ | State | City/Population | +-----------------+-----------------------------------------------------------------------------------------+ | Capital Region | {"Canberra": 322723} | | New South Wales | {"Sydney": 3276207, "Newcastle": 270324, "Wollongong": 219761, "Central Coast": 227657} | | Queensland | {"Cairns": 92273, "Brisbane": 1291117, "Gold Coast": 311932, "Townsville": 109914} | | South Australia | {"Adelaide": 978100} | | Tasmania | {"Hobart": 126118} | | Victoria | {"Geelong": 125382, "Melbourne": 2865329} | | West Australia | {"Perth": 1096829} | +-----------------+-----------------------------------------------------------------------------------------+
I det här fallet grupperade vi städerna efter deras stat/distrikt. Men om vi bara vill ha ett stort JSON-objekt som innehåller alla städer/populationer för det landet, kan vi ta bort staten/distriktet (och dess associerade GROUP BY
klausul) från frågan helt och hållet.
SELECT JSON_OBJECTAGG(Name, Population) AS 'City/Population' FROM City WHERE CountryCode = 'AUS';
Resultat:
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | City/Population | +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | {"Perth": 1096829, "Cairns": 92273, "Hobart": 126118, "Sydney": 3276207, "Geelong": 125382, "Adelaide": 978100, "Brisbane": 1291117, "Canberra": 322723, "Melbourne": 2865329, "Newcastle": 270324, "Gold Coast": 311932, "Townsville": 109914, "Wollongong": 219761, "Central Coast": 227657} | +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
Se även JSON_ARRAYAGG()
funktion som låter dig aggregera dina frågeresultat till en JSON-array.