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

Làm cách nào để tạo các đối tượng json lồng nhau bằng cách sử dụng các hàm json bản địa của mysql?

Lý do bạn nhận được những lỗi này là đối tượng json mẹ không mong đợi một tập hợp kết quả làm một trong các đầu vào của nó, bạn cần có các cặp đối tượng đơn giản như {name, string} vv báo cáo lỗi - có thể có sẵn trong chức năng trong tương lai ... điều này chỉ có nghĩa là bạn cần chuyển đổi các kết quả nhiều hàng của mình thành một tập hợp các kết quả được phân tách bằng dấu phẩy và sau đó chuyển đổi thành một mảng json.

Bạn gần như đã có nó với ví dụ thứ hai của mình.

Bạn có thể đạt được những gì hiện tại với hàm GROUP_CONCAT

select json_object(
  'id',p.id 
 ,'desc',p.`desc`
 ,'child_objects',json_array(
                     (select GROUP_CONCAT(
                                 json_object('id',id,'parent_id',parent_id,'desc',`desc`)
                             )   
                      from child_table 
                      where parent_id = p.id))
                   )
 from parent_table p;

Điều này gần như hoạt động, nó kết thúc việc coi truy vấn con như một chuỗi để lại các ký tự thoát ở đó.

'{\"id\": 1, 
\"desc\": \"parent row 1\", 
\"child_objects\": 
    [\"
    {\\\"id\\\": 1,
     \\\"desc\\\": \\\"child row 1\\\", 
    \\\"parent_id\\\": 1
    },
    {\\\"id\\\": 2, 
    \\\"desc\\\": \\\"child row 2\\\", 
    \\\"parent_id\\\": 1}\"
    ]
}'

Để làm cho điều này hoạt động ở định dạng thích hợp, bạn cần thay đổi cách tạo đầu ra JSON như sau:

select json_object(
  'id',p.id 
 ,'desc',p.`desc`
 ,'child_objects',(select CAST(CONCAT('[',
                GROUP_CONCAT(
                  JSON_OBJECT(
                    'id',id,'parent_id',parent_id,'desc',`desc`)),
                ']')
         AS JSON) from child_table where parent_id = p.id)

 ) from parent_table p;

Điều này sẽ cung cấp cho bạn kết quả chính xác mà bạn yêu cầu:

'{\"id\": 1, 
\"desc\": \"parent row 1\", 
\"child_objects\": 
    [{\"id\": 1, 
    \"desc\": \"child row 1\", 
    \"parent_id\": 1
    }, 
    {\"id\": 2, 
    \"desc\": \"child row 2\", 
    \"parent_id\": 1
    }]  
}'


  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 SELECT WHERE datetime khớp với ngày (và không nhất thiết phải là thời gian)

  2. Cài đặt và làm việc với MySQL 5 trên Windows 7

  3. Lưu trữ hình ảnh trong cơ sở dữ liệu trực tiếp hay dưới dạng dữ liệu base64?

  4. SQLSTATE [HY000] [2002] Cố gắng kết nối không thành công .. - Khi cố gắng kết nối từ Máy chủ cục bộ đến máy chủ từ xa

  5. Chọn N hàng cuối cùng từ MySQL