Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.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
Sql 显示具有一对多关系的两个表中的多行数据_Sql_Node.js_Postgresql_One To Many - Fatal编程技术网

Sql 显示具有一对多关系的两个表中的多行数据

Sql 显示具有一对多关系的两个表中的多行数据,sql,node.js,postgresql,one-to-many,Sql,Node.js,Postgresql,One To Many,我有两张桌子。跟踪和元数据。曲目可以有多个元数据属性,但元数据只能附加到单个曲目。元数据表有一个用于跟踪ID的外键,但跟踪表没有用于元数据的外键。我正试图找到获得此结果的最佳方法: [{ trackID: 6, trackName: "test", /* these are the data from the tracks table */ metadata: [ { bpm: 123 /* This is the data fro

我有两张桌子。跟踪和元数据。曲目可以有多个元数据属性,但元数据只能附加到单个曲目。元数据表有一个用于跟踪ID的外键,但跟踪表没有用于元数据的外键。我正试图找到获得此结果的最佳方法:

[{
   trackID: 6,
   trackName: "test", /* these are the data from the tracks table */
   metadata: [
     {
        bpm: 123 /* This is the data from the metadata table */
     },
     ...
   ]
},
{
   trackID: 7,
   trackName: "test2",
   metadata: [
     {
        bpm: 135
     },
     ...
   ]
}]
本质上,我试图获得多个曲目,每个曲目都有多个元数据属性。我能想到的唯一方法就是首先查询曲目

从曲目中选择*

然后在后端,为返回的每个曲目发送另一个查询

从元数据中选择*,其中track=

在不向数据库发送许多查询的情况下,更好的方法是什么

我也尝试过加入,例如:

选择*FROM tracks LEFT JOIN metadata.track=track.id,其中track.id>5限制10

但这需要在后端对其进行解析,并检查每一行是否具有相同的曲目ID,并且总体上看起来也比较缓慢和不理想

有没有更好的方法,这里的最佳实践是什么?先谢谢你


PS:如果有帮助的话,我正在使用Postgres、NodeJS和Prisma。

你应该使用聚合。目前尚不清楚您的数据究竟是什么样的,以及您希望结果是什么样的。例如,如果您只需要元数据中的bpm列(如结果所示),则这会将该值放入名为metadata的数组列中:

如果需要其他列,可以将整个记录放入数组中:

ARRAY_AGG(m) as metadata

Postgres也通过JSON函数支持所有这些功能。

示例数据——或者至少是表的布局——将非常有用。我无法满足您的确切要求,需要更多信息,但在处理连接选项时,您说需要在后端对其进行解析并检查每一行。这正是join所做的,您不必做任何额外的事情,它将比您拥有的2查询选项快得多。一般说来,RDBMS的目的是快速进行连接。除了复杂的显示格式外,IMHO总是在后端尽可能多地工作。这正是我想要的,工作完美无瑕!非常感谢你!
ARRAY_AGG(m) as metadata