表a
和表b
之间存在多对多关系。该关系存储在表a_b
中,该表有两个字段:a_id
、b_id
。
对于 b
中 group
= 'XYZ' 的所有记录,我想要:
- 在
a_b
中查找匹配记录,然后... - 将
a_id
的相应值作为 JSON 数组插入b.my_json
第一部分很简单:
SELECT * FROM a_b INNER JOIN b ON a_b.b_id = b.id WHERE b.group = 'XYZ'
我知道我需要使用更新查询(update b
),并且我可能需要使用 JSON_SET
函数,但是我应该从哪里开始?
最佳答案
如果您存储的只是一个 int id 数组,则可以避免使用 JSON_SET
并仅使用 GROUP_CONCAT
UPDATE b as _b
JOIN (
## selecting comma delimited list of ids for a json array
SELECT
a_b.b_id,
CONCAT('[',GROUP_CONCAT(a_b.a_id ORDER BY a_b.a_id),']') as json
FROM a_b JOIN b ON b.id=a_b.b_id
WHERE b.group = 'XYZ'
GROUP BY b.id
) AS _a_b ON _a_b.b_id = _b.id
## set those matched a_b and b records w/ group XYZ w/ formed json
SET _b.my_json = _a_b.json
;
基本上,我们使用表别名来获取可用于 UPDATE
语句的分组 ID。
注意:GROUP_CONCAT 作为默认最大长度,但如果您要连接数千个 id,则可以随时增加该长度。
关于mysql - 使用 MySQL 和 JSON 的更新查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49246368/