Как сгруппировать несколько значений в одно на основе заданного значения столбца c? - PullRequest
0 голосов
/ 26 февраля 2020

Я работаю над своим проектом и мне нужна помощь. Я делаю свою конечную точку в WordPress. Все отлично работает, кроме одного. У меня есть база данных

| id |  city  | company       | email             | website
--------------------------------------------------------------
| 22 | city_1 | company one   | comp@example.com  | comp1.com
--------------------------------------------------------------
| 12 | city_2 | company two   | comp2@example.com | comp2.com
--------------------------------------------------------------
| 31 | city_2 | company three | comp3@example.com | comp3.com
--------------------------------------------------------------
| 72 | city_3 | company four  | comp4@example.com | comp4.com

Я хочу напечатать JSON, который содержит этот формат

   {
      "city":"city_1",
      "companies": [
        {
         "id":"22",
         "email":"comp@example.com",
         "website":"comp1.com"
        }
      ],
   },
   {
      "city":"city_2",
      "companies": [
        {
         "id":"12",
         "email":"comp2@example.com",
         "website":"comp2.com"
        },
        {
         "id":"31",
         "email":"comp3@example.com",
         "website":"comp3.com"
        }
      ],
   },
   {
      "city":"city_4",
      "companies": [
        {
         "id":"72",
         "email":"comp4@example.com",
         "website":"comp4.com"
        }
      ],
   },

Итак, я хочу сгруппировать несколько значений в одно на основе значения города. Как мне это сделать? Я пытался с оператором GROUP BY, но он дает мне одну строку. Мой текущий SQL запрос

SELECT * FROM database ORDER BY city COLLATE utf8_polish_ci

Спасибо за любую помощь!

1 Ответ

3 голосов
/ 26 февраля 2020

Использовать

JSON_ARRAYAGG

select JSON_ARRAYAGG(JSON_OBJECT('city',city,'companies',companies)) from (
select city,JSON_ARRAYAGG(JSON_OBJECT('id',id,'company', 
company,'email',email,'website',website)) as companies from test group by city
)t;

Это напечатает ожидаемый вывод в формате JSON.

Вывод:

[
{
"city": "city_1", "companies": [{"id": 22, "email": "comp@example.com ", "company": "company one  ", "website": "comp1.com"}]
}, 
{
"city": "city_2", "companies": [{"id": 12, "email": "comp2@example.com", "company": "company two  ", "website": "comp2.com"}, 
{"id": 31, "email": "comp3@example.com", "company": "company three", "website": "comp3.com"}]
}
]
...