带节点的MySQL:如何返回嵌套数据
我有三张桌子:post,tag和post_-tag带节点的MySQL:如何返回嵌套数据,mysql,sql,json,stored-procedures,Mysql,Sql,Json,Stored Procedures,我有三张桌子:post,tag和post_-tag createtablepost( id INT不为空, 标题VARCHAR(45)空, 主键(id)); 创建表标记( id INT不为空, 标记VARCHAR(45)NULL, 主键(id)); 创建表post_标记( post_id INT不为空, tag_id INT不为空, 主键(post_id、tag_id), 索引fk_post_tag_tag1_idx(tag_id ASC), 索引fk\U post\U tag\U post\U
createtablepost(
id INT不为空,
标题VARCHAR(45)空,
主键(id));
创建表标记(
id INT不为空,
标记VARCHAR(45)NULL,
主键(id));
创建表post_标记(
post_id INT不为空,
tag_id INT不为空,
主键(post_id、tag_id),
索引fk_post_tag_tag1_idx(tag_id ASC),
索引fk\U post\U tag\U post\U idx(post\U id ASC),
约束fk\U post\U tag\U post
外键(post_id)
参考职位(id),
约束fk\U post\U tag\U tag1
外键(tag_id)
参考标记(id));
插入post(id、标题)值(1,“post 1”);
在post(id、标题)值中插入(2,‘post 2’);
插入标签(id,标签)值(1,‘标签1’);
插入标签(id,标签)值(2,‘标签2’);
插入post_标签(post_id,tag_id)值(1,1);
插入post_标签(post_id,tag_id)值(1,2);
插入post_标签(post_id,tag_id)值(2,1);
插入post_标签(post_id,tag_id)值(2,2);
然后,我可以创建一个存储过程来检索带有标记的第一篇文章:
分隔符$$
创建过程选择_posts_标记(在id INT中)
开始
挑选*
邮寄
post.id上的内部连接post\u标记pt=pt.post\u id
t.id上的内部连接标记t=pt.tag\U id
其中post.id=id
按邮政id、t.id分组;
结束$$
定界符;
最后,我从节点调用存储过程:
var mysql=require(“mysql”);
var connection=mysql.createConnection({
主持人:“127.0.0.1”,
用户:“测试_数据库”,
密码:“test_数据库”,
数据库:“测试数据库”,
});
connection.connect();
constsql=`callselect_posts_标记(${1})`;
查询(sql,(错误,结果)=>
log(JSON.stringify(结果[0],null,4))
);
连接。结束();
但结果是一组平面对象:
[
{
"id": 1,
"title": "post 1",
"post_id": 1,
"tag_id": 1,
"tag": "tag 1"
},
{
"id": 2,
"title": "post 1",
"post_id": 1,
"tag_id": 2,
"tag": "tag 2"
}
]
结果是相同平面JSON对象的数组用不同的标记重复两次
如何在post对象中的«tags»键中以嵌套数组的形式检索标记?结果应该是:
[
{
id: 1,
title: "post 1",
tags: [
{
id: 1,
tag: "tag 1",
},
{
id: 2,
tag: "tag 2",
},
],
},
];
谢谢 您可以使用
json_arrayagg()
和json_object()
如下:
SELECT
p.id,
p.title,
json_arrayagg(json_object('id', t.id, 'tag', t.tag)) tags
FROM post p
INNER JOIN post_tag pt ON p.id = pt.post_id
INNER JOIN tag t ON t.id = pt.tag_id
WHERE p.id = ?
GROUP BY p.id, p.title;
谢谢,这很有意义……但是我在标记数组中得到了转义的JSON:
“[{\'id\':1,\'tag\':\'tag1\',{\'id\':2,\'tag\':\'tag2\'}]”
。有没有办法避免这种情况?嵌套JSON作为字符串返回的错误是由于使用npmmysql
package而不是mysql2