Sql 显示具有一对多关系的两个表中的多行数据
我有两张桌子。跟踪和元数据。曲目可以有多个元数据属性,但元数据只能附加到单个曲目。元数据表有一个用于跟踪ID的外键,但跟踪表没有用于元数据的外键。我正试图找到获得此结果的最佳方法: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
[{
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