Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да SQL заявя родител-дете за конкретен JSON формат?

Можете да генерирате JSON съдържание директно от MySQL. Ето решение, което работи с MySQL 5.7 или по-нова версия.

Като начало, разгледайте функция JSON_OBJECT() , който генерира JSON обект за всеки запис в таблицата:

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

Предвид вашите примерни данни, това връща:

<предварителен код>| ID | име на проект | родител_идентификатор | js || --- | ------------------ | --------- | -------------------------------------------------- -------------- || 1 | Къщата на Кармайкъл | 0 | {"id":1, "parent_id":0, "project_name":"Carmichael House"} || 2 | Кухня Кармайкъл | 1 | {"id":2, "parent_id":1, "project_name":"Carmichael Kitchen"} || 3 | Баня Кармайкъл | 1 | {"id":3, "parent_id":1, "project_name":"Carmichael Bathroom"} || 4 | Апартамент Дауд | 0 | {"id":4, "parent_id":0, "project_name":"Dowd Apartment"} || 5 | Кухня Дауд | 4 | {"id":5, "parent_id":4, "project_name":"Dowd Kitchen"} |

За да генерираме очаквания изход, ние ще се самоJIN таблицата, за да намерите детски записи и използвайте обобщаваща функция JSON_ARRAYAGG() за генериране на вътрешния JSON масив. Допълнително ниво на агрегиране включва всичко в един обект. Както е показано във вашите примерни данни, предположих, че основни проекти имат parent_id =0 и че има само едно ниво на йерархия:

SELECT JSON_OBJECT('projects', JSON_ARRAYAGG(js)) resultsFROM ( 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 ОТ tbl_projects p LEFT JOIN tbl_projects p1 WHERE p. parent_id =0 GROUP BY p.id, p.project_name, p.parent_id) x 

Добив:

<предварителен код>| резултати || -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ------ || {"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"}]} |

Демо на 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. MySQL SUM заявката е изключително бавна

  2. Свойството ConnectionString не е инициализирана грешка

  3. Как да вмъкнете данните от редовете на динамичната таблица в базата данни наведнъж

  4. Използвайте MySQL релационни бази данни във Fedora 12

  5. Вмъкнете по подразбиране в колона non null, ако стойността е null