MySQL enthält eine Aggregatfunktion namens JSON_OBJECTAGG()
. Mit dieser Funktion können Sie ein JSON-Objekt erstellen, das Schlüssel-Wert-Paare enthält. Genauer gesagt können Sie dieses JSON-Objekt basierend auf den Ergebnissen einer Abfrage erstellen.
Es akzeptiert zwei Argumente, von denen das erste als Schlüssel und das zweite als Wert verwendet wird. Diese Argumente können Spaltennamen oder Ausdrücke sein.
Syntax
Die Syntax lautet wie folgt:
JSON_OBJECTAGG(Schlüssel, Wert)
Wobei key
ist die Spalte oder der Ausdruck, der den Schlüssel darstellt des Schlüssel/Wert-Paares und value
ist die Spalte oder der Ausdruck, der den Wert darstellt des Schlüssel/Wert-Paares.
Beispiel
Hier ist ein Beispiel zur Veranschaulichung.
Hier ist eine häufige Abfrage, die wir ohne ausführen könnten das JSON_OBJECTAGG()
Funktion:
SELECT District AS 'State', Name AS 'City', PopulationFROM CityWHERE CountryCode ='AUS'ORDER BY State;
Ergebnis:
+------------+---------------+------------ +| Zustand | Stadt | Bevölkerung |+------------+---------------+------------+ | Hauptstadtregion | Canberra | 322723 || Neusüdwales | Sydney | 3276207 || Neusüdwales | Neuburg | 270324 || Neusüdwales | Zentrale Küste | 227657 || Neusüdwales | Wollongong | 219761 || Queensland | Brisbane | 1291117 || Queensland | Goldküste | 311932 || Queensland | Stadtville | 109914 || Queensland | Steinhaufen | 92273 || Südaustralien | Adelheid | 978100 || Tasmanien | Hobart | 126118 || Viktoria | Melbourne | 2865329 || Viktoria | Geelong | 125382 || Westaustralien | Perth | 1096829 |+------------+---------------+------------+
Diese Abfrage können wir so anpassen, dass Name
Spalte (in diesem Beispiel haben wir dieser Spalte einen Alias von City
gegeben ) wird zu einem Schlüssel und die Population
Spalte wird zu einem Wert.
Wir verwenden auch ein GROUP BY
-Klausel, um die Ergebnisse nach dem District
zu gruppieren Spalte (in diesem Fall haben wir einen Alias für diese Spalte namens State
erstellt ).
SELECT District AS 'State', JSON_OBJECTAGG(Name, Population) AS 'City/Population'FROM CityWHERE CountryCode ='AUS'GROUP BY State;
Ergebnis:
+------------+------------------------------------ -------------------------------------------------- -----------+| Zustand | Stadt/Einwohnerzahl |+----------------+----------------------------------- -------------------------------------------------- -------------+| Hauptstadtregion | {"Canberra":322723} || Neusüdwales | {"Sydney":3276207, "Newcastle":270324, "Wollongong":219761, "Central Coast":227657} || Queensland | {"Cairns":92273, "Brisbane":1291117, "Gold Coast":311932, "Townsville":109914} || Südaustralien | {"Adelaide":978100} || Tasmanien | {"Hobart":126118} || Viktoria | {"Geelong":125382, "Melbourne":2865329} || Westaustralien | {"Perth":1096829} |+------------+----------------------- -------------------------------------------------- ----------------+
In diesem Fall haben wir die Städte nach ihrem Bundesland/Bezirk gruppiert. Wenn wir jedoch nur ein großes JSON-Objekt haben möchten, das alle Städte/Bevölkerungen für dieses Land enthält, können wir das Bundesland/den Bezirk (und das zugehörige GROUP BY
) entfernen -Klausel) vollständig aus der Abfrage entfernt.
SELECT JSON_OBJECTAGG(Name, Population) AS 'City/Population'FROM CityWHERE CountryCode ='AUS';
Ergebnis:
+---------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ---------------------------------+| Stadt/Einwohnerzahl |+--------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------+| {"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} |+----------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ----------------------------+
Siehe auch JSON_ARRAYAGG()
Funktion, mit der Sie Ihre Abfrageergebnisse in einem JSON-Array aggregieren können.