Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana cara SQL query parent-child untuk format JSON tertentu?

Anda dapat menghasilkan konten JSON langsung dari MySQL. Berikut adalah solusi yang bekerja dengan MySQL 5.7 atau lebih tinggi.

Sebagai permulaan, pertimbangkan fungsi JSON_OBJECT() , yang menghasilkan objek JSON untuk setiap record dalam tabel:

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

Mengingat data sampel Anda, ini mengembalikan:

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

Untuk menghasilkan keluaran yang Anda harapkan, kami akan melakukan sendiriJOIN tabel untuk menemukan catatan anak, dan gunakan fungsi agregat JSON_ARRAYAGG() untuk menghasilkan larik JSON bagian dalam. Tingkat agregasi tambahan memasukkan semuanya ke dalam satu objek. Seperti yang ditunjukkan dalam contoh data Anda, saya berasumsi bahwa proyek root memiliki parent_id = 0 dan hanya ada satu tingkat 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

Hasil:

| 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 di 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. Kembalikan hasil acak ( pesan berdasarkan Rand() )

  2. Mengapa beberapa jenis kueri yang disiapkan menggunakan PDO di PHP dengan MySQL lambat?

  3. pernyataan sql kompleks ke baris yang berbeda

  4. sertakan mysql ke cmake

  5. Tambahkan indeks FULLTEXT di Doctrine 2 menggunakan anotasi?