MySQL zawiera funkcję agregującą o nazwie JSON_OBJECTAGG()
. Ta funkcja umożliwia utworzenie obiektu JSON zawierającego pary klucz-wartość. Dokładniej, pozwala stworzyć ten obiekt JSON na podstawie wyników zapytania.
Przyjmuje dwa argumenty, z których pierwszy jest używany jako klucz, a drugi jako wartość. Te argumenty mogą być nazwami kolumn lub wyrażeniami.
Składnia
Składnia wygląda tak:
JSON_OBJECTAGG(key, value)
Gdzie key
to kolumna lub wyrażenie reprezentujące klucz pary klucz/wartość i value
to kolumna lub wyrażenie reprezentujące wartość pary klucz/wartość.
Przykład
Oto przykład do zademonstrowania.
Oto typowe zapytanie, które możemy uruchomić bez JSON_OBJECTAGG()
funkcja:
SELECT District AS 'State', Name AS 'City', Population FROM City WHERE CountryCode = 'AUS' ORDER BY State;
Wynik:
+-----------------+---------------+------------+ | 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 | +-----------------+---------------+------------+
Możemy dostosować to zapytanie, aby Name
kolumna (w tym przykładzie nadaliśmy tej kolumnie alias City
) staje się kluczem, a Population
kolumna staje się wartością.
Używamy również GROUP BY
klauzula grupująca wyniki według District
kolumna (w tym przypadku utworzyliśmy alias dla tej kolumny o nazwie State
).
SELECT District AS 'State', JSON_OBJECTAGG(Name, Population) AS 'City/Population' FROM City WHERE CountryCode = 'AUS' GROUP BY State;
Wynik:
+-----------------+-----------------------------------------------------------------------------------------+ | 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} | +-----------------+-----------------------------------------------------------------------------------------+
W tym przypadku pogrupowaliśmy miasta według stanu/okręgu. Jeśli jednak chcemy tylko jednego dużego obiektu JSON zawierającego wszystkie miasta/populacje dla tego kraju, możemy usunąć stan/okręg (i powiązany z nim GROUP BY
klauzula) w całości z zapytania.
SELECT JSON_OBJECTAGG(Name, Population) AS 'City/Population' FROM City WHERE CountryCode = 'AUS';
Wynik:
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | 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} | +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
Zobacz także JSON_ARRAYAGG()
funkcja, która pozwala agregować wyniki zapytania w tablicę JSON.