MySQL включва агрегатна функция, наречена JSON_OBJECTAGG()
. Тази функция ви позволява да създадете JSON обект, съдържащ двойки ключ-стойност. По-конкретно, той ви позволява да създадете този JSON обект въз основа на резултатите от заявка.
Той приема два аргумента, като първият от тях се използва като ключ, а вторият като стойност. Тези аргументи могат да бъдат имена на колони или изрази.
Синтаксис
Синтаксисът е така:
JSON_OBJECTAGG(key, value)
Където key
е колоната или изразът, който представлява ключ на двойката ключ/стойност и value
е колоната или изразът, който представлява стойността на двойката ключ/стойност.
Пример
Ето пример за демонстрация.
Ето една често срещана заявка, която може да изпълняваме без JSON_OBJECTAGG()
функция:
SELECT District AS 'State', Name AS 'City', Population FROM City WHERE CountryCode = 'AUS' ORDER BY State;
Резултат:
+-----------------+---------------+------------+ | 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 | +-----------------+---------------+------------+
Можем да коригираме тази заявка, така че Name
колона (в този пример сме дали на тази колона псевдоним на City
) става ключ, а Population
колоната става стойност.
Ние също така използваме GROUP BY
клауза за групиране на резултатите по District
колона (в този случай сме създали псевдоним за тази колона, наречен State
).
SELECT District AS 'State', JSON_OBJECTAGG(Name, Population) AS 'City/Population' FROM City WHERE CountryCode = 'AUS' GROUP BY State;
Резултат:
+-----------------+-----------------------------------------------------------------------------------------+ | 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} | +-----------------+-----------------------------------------------------------------------------------------+
В този случай групирахме градовете по техния щат/област. Въпреки това, ако искаме само един голям JSON обект, съдържащ всички градове/населения за тази държава, можем да премахнем държавата/окръга (и свързания с него GROUP BY
клауза) от заявката като цяло.
SELECT JSON_OBJECTAGG(Name, Population) AS 'City/Population' FROM City WHERE CountryCode = 'AUS';
Резултат:
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | 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} | +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
Вижте също JSON_ARRAYAGG()
функция, която ви позволява да агрегирате резултатите от заявката си в JSON масив.