MySQL如何根据条件合并JSON_ARRAY?

MySQL如何根据条件合并多个JSON_ARRAY?

MySQL 兼容版本 8.0.21

不允许使用JSON_TABLE(因为用的Vitess MySQL 8.0.21,当前版本还不支持JSON_Table,其他功能几乎一样,其他json函数都可以用,比如json_merge等 就正常在MySQL里测试就行。

现有2个表:

TABLE-1 user_subscriptions 用户订阅
sub_sources (新闻订阅源) 和 unread_news_ids (未读新闻id) 都是 JSON_ARRAY类型

img

sub_sources里面记录了每一位用户都订阅了哪里的新闻源(比如腾讯新闻,网易新闻,新浪新闻)
unread_news_ids里面记录了每一位用户当前未读的新闻id, 当然也可以是空的。
比如用户 wang, 他订阅了 tencent_news和wangyi_news, 所以他的未读新闻id里面只有 t1,t2 (来自tencent_news), 和 w1(来自wangyi_news)。

TABLE-2 updated_news 更新的新闻
updated_news_ids (更新的新闻ID) 是 JSON_ARRAY

img

updated_news_ids是对应的新闻源刚才更新推送的新闻id, 比如tencent_news刚才推送的新闻id是 t8,和 t9,和 t10。
我的目标就是 把这些 更新的新闻id 根据用户的订阅 添加到表1的 unread_news_ids (未读新闻id) 里。

结果:
这是我想要的更新后的表1
TABLE-1 user_subscriptions 用户订阅

img

如何 写一个query来 在数据库里 完成上述 更新表的 工作,而不是返回到计算服务器上进行。
因为我用的serverless function,把数据拉出来再更新就比较麻烦和成本高,serverless function限制较多。
mysql也是在云上serverless的,我是在serverless function 发出一条携带query的request给mysql让它执行,query语句和正常使用mysql一样,只是一次只能发一个query。

我本来的思路是下面这样的:

@A1 = SELECT updated_news_ids
        FROM   updated_news
        WHERE  (
                    SELECT updated_news.source_id member of
                            (
                                    SELECT sub_sources
                                    FROM   user_subscriptions
                                    WHERE  user_id = user_subscriptions.user_id
                            )
                )

@B1 = SELECT JSON_MERGE(@A1)

UPDATE user_subscriptions SET unread_news_ids = JSON_MERGE(unread_feeds_id, @B1)

因为JSON_MERGE的输入格式需要里面是几个待合并的JSON_ARRAY,但是@A1是 好多个ROW的JSON_ARRAY,
至此我不知道怎么做了。数据库性能很强,表也没有特别长,不用担心执行慢的问题。
求大家提供建议

先降维在合并

参考下这个:https://www.5axxw.com/questions/content/i4fnwg

可以使用JSON_ARRAYAGG()函数和GROUP BY子句来根据条件合并JSON_ARRAY。

SELECT condition, JSON_ARRAYAGG(json_column)
FROM table
GROUP BY condition;

这将根据condition字段将json_column列中的值合并到单个JSON_ARRAY中。

望采纳!!!点击回答右侧采纳即可!!

您可以将 @A1 的查询结果用 JSON_ARRAYAGG 函数聚合成一个 JSON 数组,然后再使用 JSON_MERGE 函数合并。

具体来说,你可以将上述查询改为如下形式:

SELECT JSON_MERGE(unread_feeds_id, JSON_ARRAYAGG(updated_news_ids))
FROM updated_news
WHERE (SELECT updated_news.source_id member of
            (
                    SELECT sub_sources
                    FROM user_subscriptions
                    WHERE user_id = user_subscriptions.user_id
            )
)


然后你可以使用 UPDATE 语句将合并后的结果更新到 user_subscriptions 表中。


UPDATE user_subscriptions
SET unread_feeds_id = JSON_MERGE(unread_feeds_id,
(SELECT JSON_ARRAYAGG(updated_news_ids)
FROM updated_news
WHERE (SELECT updated_news.source_id member of
(
SELECT sub_sources
FROM user_subscriptions
WHERE user_id = user_subscriptions.user_id
)
)
)
)