Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak wykonać zapytanie SQL rodzic-dziecko dla określonego formatu JSON?

Możesz generować zawartość JSON bezpośrednio z MySQL. Oto rozwiązanie, które działa z MySQL w wersji 5.7 lub nowszej.

Na początek rozważ funkcję JSON_OBJECT() , który generuje obiekt JSON dla każdego rekordu w tabeli:

SELECT 
    p.*, 
    JSON_OBJECT('id', id, 'project_name', project_name, 'parent_id', parent_id) js
FROM tbl_projects p;

Biorąc pod uwagę Twoje przykładowe dane, zwraca:

| id  | project_name        | parent_id | js                                                               |
| --- | ------------------- | --------- | ---------------------------------------------------------------- |
| 1   | Carmichael House    | 0         | {"id": 1, "parent_id": 0, "project_name": "Carmichael House"}    |
| 2   | Carmichael Kitchen  | 1         | {"id": 2, "parent_id": 1, "project_name": "Carmichael Kitchen"}  |
| 3   | Carmichael Bathroom | 1         | {"id": 3, "parent_id": 1, "project_name": "Carmichael Bathroom"} |
| 4   | Dowd Apartment      | 0         | {"id": 4, "parent_id": 0, "project_name": "Dowd Apartment"}      |
| 5   | Dowd Kitchen        | 4         | {"id": 5, "parent_id": 4, "project_name": "Dowd Kitchen"}        |

Aby wygenerować oczekiwany wynik, samodzielnie JOIN tabela, aby znaleźć rekordy podrzędne i użyj funkcja agregująca JSON_ARRAYAGG() do wygenerowania wewnętrznej tablicy JSON. Dodatkowy poziom agregacji spycha wszystko do jednego obiektu. Jak pokazano w przykładowych danych, założyłem, że projekty główne mają parent_id = 0 i że istnieje tylko jeden poziom hierarchii:

SELECT JSON_OBJECT('projects', JSON_ARRAYAGG(js)) results
FROM (
    SELECT JSON_OBJECT(
        'id', p.id, 
        'project_name', p.project_name, 
        'parent_id', p.parent_id,
        'children', JSON_ARRAYAGG(
            JSON_OBJECT(
                'id', p1.id, 
                'project_name', p1.project_name, 
                'parent_id', p1.parent_id
            )
        )
    ) js
    FROM tbl_projects p
    LEFT JOIN tbl_projects p1 ON p.id = p1.parent_id
    WHERE p.parent_id = 0
    GROUP BY p.id, p.project_name, p.parent_id
) x

Plony:

| results                                                                                                                                                                                                                                                                                                                                                              |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| {"projects": [{"id": 1, "children": [{"id": 2, "parent_id": 1, "project_name": "Carmichael Kitchen"}, {"id": 3, "parent_id": 1, "project_name": "Carmichael Bathroom"}], "parent_id": 0, "project_name": "Carmichael House"}, {"id": 4, "children": [{"id": 5, "parent_id": 4, "project_name": "Dowd Kitchen"}], "parent_id": 0, "project_name": "Dowd Apartment"}]} |

Demo na DB Fiddle




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak uzyskać listę baz danych?

  2. Skrypty SQL — czy istnieje odpowiednik #define?

  3. Zachowanie wartości pól tekstowych nawet po odświeżeniu

  4. MySQL group_concat z zaznaczeniem wewnątrz wybierz

  5. Sequelize Znajdź należące do wielu stowarzyszenia