簡體   English   中英

Mysql:使用來自不同表/列的值更新 json 列

[英]Mysql: Update json column with values from different table/column

我一直在嘗試將location table中的以下neighbors column更新為 json object,如下所示,但無法以任何方式遠程接近工作。 關於查詢語法的任何想法?

原表:

location
---------------
id  name  neighbors
1   loc1
2   loc2
3   loc3
4   loc4
5   loc5

附近(這是連接表,地點和隔壁指的是 location.id)

nearby
-------------------
place   nextdoor    distance    group
1       2           500m         g1
1       3           900m         g1
2       1           500m         g3
2       3           100m         g4
2       4           80m          g4

預計更新后:

location
---------------
id  name  neighbors
1   loc1  {"g1":[{"name":"loc2", "distance":"500m"},{"name":"loc3", "distance":"900m"}]}
2   loc2  {"g3":[{"name":"loc1", "distance":"500m"}],"g4":[{"name":"loc3", "distance":"100m"},{"name":"loc4", "distance":"80m"}]}
3   loc3
4   loc4
5   loc5

試一試。 它在 MySQL 8 上進行了測試。我將其分解為多個步驟,因此您可以逐個測試每個 CTE,看看它是如何組合在一起的。

create table location (id int, name varchar(10), neighbors json);
insert into location (id, name) values
(1, 'loc1'), (2, 'loc2'), (3, 'loc3'), (4, 'loc4'), (5, 'loc5');

create table nearby (place int, nextdoor int, distance varchar(10), mygroup varchar(10));
insert into nearby values
(1, 2, '500m', 'g1'), (1, 3, '900m', 'g1'),
(2, 1, '500m', 'g3'), (2, 3, '100m', 'g4'), (2, 4, '80m', 'g4');

更新查詢

with flatten_neighbor as (
    select nn.place, nn.name, l.name as nextdoorname, nn.distance, nn.mygroup
    from (
        select l.id, l.name, n.place, n.nextdoor, n.distance, n.mygroup
        from location l
        join nearby n on n.place = l.id
    ) nn
    join location l on l.id = nn.nextdoor
),
obj_by_place as (
    select *, json_object('name', nextdoorname, 'distance', distance) as jo 
    from flatten_neighbor
),
concat_obj as (
    select place, mygroup, concat('[', group_concat(jo), ']') as jason
    from obj_by_place group by place, mygroup
),
final as (
    select place, json_objectagg(mygroup, jason) stuff
    from concat_obj group by place
)
update location l join final f on l.id = f.place set l.neighbors = f.stuff;

結果

編號 | 姓名 | 鄰居 -: |:--- |:---------------------------------------- -------------------------------------------------- -------------------------------------------------- --------------- 1 | 位置1 |  {"g1":"[{\"name\":\"loc2\",\"距離\":\"500m\"},{\"name\":\"loc3\",\"距離\ ": \"900m\"}]"} 2 | 位置2 |  {"g3":"[{\"name\":\"loc1\",\"距離\":\"500m\"}]","g4":"[{\"name\":\" loc3\", \"距離\": \"100m\"},{\"名稱\": \"loc4\", \"距離\": \"80m\"}]"} 3 | 位置3 |  null 4 |  loc4 |  null 5 | 位置5 |  null

例子

https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=789fb79d10b745414ca7270a5a6ef004

另一個帶有更新后的 json_extract 示例。

https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=fe651372ca754cc05eab842d6fced9a3

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM