Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带节点的MySQL:如何返回嵌套数据_Mysql_Sql_Json_Stored Procedures - Fatal编程技术网

带节点的MySQL:如何返回嵌套数据

带节点的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

我有三张桌子: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 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作为字符串返回的错误是由于使用npm
mysql
package而不是
mysql2