2016-03-23 12 views
6

Tôi đang cố gắng tạo hệ thống ghi chú/nhận xét cho khu vực quản trị với hỗ trợ MySQL JSON mới. Bình luận cần phải được chỉnh sửa và tôi muốn thêm hỗ trợ cho những thứ khác trong tương lai, có thể tập tin đính kèm (sẽ lưu trữ các filepath trong JSON chỉ không phải là tập tin chính nó!).MySQL 5.7.8 JSON hợp nhất dữ liệu mới

{ 
    "comments": [ 
    { 
     "comment": "This is a comment", 
     "user_id": 5, 
     "datecreated": "2016-03-19" 
    }, 
    { 
     "comment": "This is a comment", 
     "user_id": 1, 
     "datecreated": "2016-03-19" 
     "comments": [ 
     { 
      "comment": "This is a sub-comment", 
      "user_id": 4, 
      "datecreated": "2016-03-19" 
     }, 
     { 
      "comment": "This is a sub-comment", 
      "user_id": 4, 
      "datecreated": "2016-03-19" 
     } 
     ] 
    } 
    ] 
} 

Tôi nghĩ sẽ có cách để hợp nhất dữ liệu mới tương tự như array_merge() mà không cần phải nhắm mục tiêu khóa cụ thể mỗi lần.

Truy vấn này hoạt động nhưng chỉ nhắm mục tiêu một nội dung, nội dung văn bản của nhận xét. Nếu tôi muốn thêm/chỉnh sửa thẻ, hình ảnh hoặc tệp đính kèm, v.v ... thì tôi cần một truy vấn rất dài hoặc một số truy vấn.

UPDATE shared_notes SET json = JSON_REPLACE(json, "$.comments[1].comment", "This is a test comment") WHERE note_id = :note_id 

tôi đã cố gắng sử dụng các hàm JSON_REPLACE và JSON_SET với JSON_OBJECT nhưng nó ghi đè tất cả các phím không được chỉ định, có nghĩa là user_id, DateCreated và bất kỳ ý kiến ​​phụ bị ghi đè.

UPDATE shared_notes SET json = JSON_REPLACE(json, "$.comments[1]", JSON_OBJECT("comment", "This is a test comment")) WHERE note_id = :note_id 

Frankenstein này của một truy vấn gần công trình nhưng nó thực sự móc nối các bình luận được cập nhật vào cuối cũ:

UPDATE shared_notes SET json = JSON_SET(json, "$.comments[1]", JSON_MERGE(JSON_EXTRACT(json, "$.comments[1]"), CAST('{"comment":"Test"}' AS JSON))) WHERE note_id = :note_id 

Vậy là có một cách tốt hơn để dễ dàng/tự động cập nhật các JSON sử dụng MySQL hoặc đang nhắm mục tiêu $.comments[1].comment, $.comments[1][0].user_id vv cách duy nhất?

+0

Ôi trời, tôi chỉ có thể cảm nhận nỗi đau của bạn. Tôi không thể hiểu được một hàm như thế không phải là một phần của các hàm json được cung cấp. Đó là một nhu cầu cơ bản như vậy! – EscapeNetscape

Trả lời

0

Đây là một câu trả lời rất muộn, nhưng vẫn còn - bạn có thể làm điều đó như thế này:

create table sampl_test(id int, comments json); 
insert into sampl_test values(1, 
'{ 
    "comments": [ 
     { 
      "comment": "This is a comment", 
      "user_id": 5, 
      "datecreated": "2016-03-19" 
     }, 
     { 
      "comment": "This is a comment", 
      "user_id": 1, 
      "datecreated": "2016-03-19", 
      "comments": [ 
       { 
        "comment": "This is a sub-comment", 
        "user_id": 4, 
        "datecreated": "2016-03-19" 
       }, 
       { 
        "comment": "This is a sub-comment", 
        "user_id": 4, 
        "datecreated": "2016-03-19" 
       } 
      ] 
     } 
    ] 
} 
') 
; 

select json_merge('{"comments" : {"comment" : "This is a test comment" }}', comments) 

from sampl_test; 
Các vấn đề liên quan