Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Làm cách nào để truy vấn SQL cha-con cho định dạng JSON cụ thể?

Bạn có thể tạo nội dung JSON trực tiếp từ MySQL. Đây là một giải pháp hoạt động với MySQL 5.7 trở lên.

Khi mới bắt đầu, coonsider chức năng JSON_OBJECT() , tạo một đối tượng JSON cho mỗi bản ghi trong bảng:

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

Với dữ liệu mẫu của bạn, kết quả này trả về:

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

Để tạo đầu ra mong đợi của bạn, chúng tôi sẽ tự JOIN bảng để tìm các bản ghi con và sử dụng hàm tổng hợp JSON_ARRAYAGG() để tạo mảng JSON bên trong. Một cấp độ tổng hợp bổ sung sẽ nhồi mọi thứ vào một đối tượng duy nhất. Như được hiển thị trong dữ liệu mẫu của bạn, tôi giả định rằng các dự án gốc có parent_id = 0 và chỉ có một mức phân cấp:

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

Lợi nhuận:

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

Bản trình diễn trên 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 CHÈN BỎ QUA nếu các giá trị hàng cụ thể trong hai cột đã tồn tại

  2. MySQL tham gia với mệnh đề where

  3. Liệt kê những người dùng có sẵn vào một ngày nhất định

  4. Phê bình thiết kế cơ sở dữ liệu MySQL của tôi cho các trường động không giới hạn

  5. LỖI 1044 (42000):Quyền truy cập bị từ chối đối với người dùng '' @ 'localhost' vào cơ sở dữ liệu 'db'