sql >> Databáze >  >> RDS >> Mysql

Jak dotazovat SQL rodič-dítě na konkrétní formát JSON?

Obsah JSON můžete generovat přímo z MySQL. Zde je řešení, které funguje s MySQL 5.7 nebo vyšší.

Pro začátek zvažte funkci JSON_OBJECT() , který generuje objekt JSON pro každý záznam v tabulce:

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

Vzhledem k vašim ukázkovým datům to vrátí:

| 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"}        |

Abychom vygenerovali váš očekávaný výstup, sami se JOIN tabulku k nalezení dětských záznamů a použití agregační funkce JSON_ARRAYAGG() k vygenerování vnitřního pole JSON. Další úroveň agregace nacpe vše do jediného objektu. Jak je ukázáno ve vašich ukázkových datech, předpokládal jsem, že kořenové projekty mají parent_id = 0 a že existuje pouze jedna úroveň hierarchie:

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

Výtěžky:

| 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"}]} |

Ukázka na DB Fiddle




  1. SQL OUTPUT Uložené procedury nefungují s ExecuteReader

  2. Jak optimalizovat bolestně pomalý dotaz MySQL, který najde korelace

  3. Jak obnovit výpis MySQL z hostitele do kontejneru Docker

  4. Nejlepší metoda pro uložení seznamu ID uživatelů