mysql 是否可以使用JSON_ARRAYAGG更新所有记录?

58wvjzkj  于 2022-10-31  发布在  Mysql
关注(0)|答案(1)|浏览(190)

我有两张table;用户和消息。
用户表
| 标识符|姓名|
| - -|- -|
| 一个|麦克|
| 2个|若翰|
消息表如下所示
| 标识符|职称|用户标识|
| - -|- -|- -|
| 一个|AAAAAA|一个|
| 2个|BBBBBB|一个|
| 三个|中交|2个|
我必须将titles列添加到用户表。
在此列中,记录值应该是与每个成员关联的消息标题的数组。即
| 标识符|姓名|标题|
| - -|- -|- -|
| 一个|麦克|【“AAAAAA”、“BBBBBB”】|
| 2个|若翰|[“中交”]|
我知道这是一种非规范化的、无意义的数据保存方式,但这只是一种假设情况。
在这种情况下,我添加了名为titles的json列,并创建了以下查询,以便使用title数组更新用户的所有记录。

UPDATE 
`users`
SET 
`users`.`titles` = 
SELECT JSON_ARRAYAGG(`messages`.`title`)
FROM `users`
LEFT OUTER JOIN `messages`
ON `messages.`user_id` = `users`.`id`
GROUP BY `members`.`id`

这里我使用JSON_ARRAYAGG创建一个数组。当我运行它时,我收到了一个语法错误。

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 10

这个查询有什么问题吗?你能教我如何修复它,如何实现我想要做的事情吗?
mysql版本是8.0.24。
先谢谢你了。

qvtsj1bj

qvtsj1bj1#

UPDATE users
NATURAL JOIN ( 
    SELECT user_id id, JSON_ARRAYAGG(title) titles
    FROM messages
    GROUP BY 1 
    ) subquery
SET users.titles = subquery.titles;

当然,必须在users表结构之前添加titles列。
不需要LEFT联接-新创建的列在所有行中都已包含NULL。但是,如果更新现有数据,包括必须清除其值的那些行,则使用NATURAL LEFT JOIN

相关问题