sql >> Databasteknik >  >> RDS >> Mysql

Hur man SQL-fråga förälder-underordnade för specifikt JSON-format?

Du kan generera JSON-innehåll direkt från MySQL. Här är en lösning som fungerar med MySQL 5.7 eller högre.

Som en förrätt, överväg funktion JSON_OBJECT() , som genererar ett JSON-objekt för varje post i tabellen:

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

Med tanke på dina exempeldata returnerar detta:

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

För att generera din förväntade utdata kommer vi att själv JOIN tabellen för att hitta barnposter och använda aggregerad funktion JSON_ARRAYAGG() för att generera den inre JSON-arrayen. En extra nivå av aggregering stoppar allt i ett enda objekt. Som framgår av dina exempeldata antog jag att rotprojekt har parent_id = 0 och att det bara finns en nivå av hierarki:

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

Avkastning:

| 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 på DB Fiddle




  1. PostgreSQL 9.0 Säkerhetskopiering och återställning

  2. Hur man laddar upp och laddar ner filer PHP och MySQL

  3. Hur tar man bort nya radtecken från datarader i mysql?

  4. Användarsökning på krypterade databasfält