显示具有一对多关系的两个表中的多行数据
Displaying Multiple Rows of Data from Two Tables with a One to Many Relationship
我有两个 table。曲目和元数据。轨道可以有多个元数据属性,但元数据只能附加到单个轨道。元数据 table 具有轨道 ID 的外键,但轨道 table 没有元数据的外键。我正在尝试找到获得此结果的最佳方法:
[{
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
},
...
]
}]
本质上,我正在尝试获取多个曲目,每个曲目都有多个元数据属性。我能想到的唯一方法是先查询曲目
SELECT * FROM tracks;
然后在后端,为每个返回的曲目发送另一个查询
SELECT * FROM metadata WHERE track=?
在不向数据库发送大量查询的情况下,这样做的更好方法是什么?
我也尝试过 JOIN ,例如:
SELECT * FROM tracks LEFT JOIN metadata ON metadata.track = track.id WHERE track.id>5 LIMIT 10 ;
但这需要在后端对其进行解析并检查每一行以查看其是否具有相同的轨道 ID,并且总体上看起来也很缓慢且次优。
有没有更好的方法,这里的最佳做法是什么?提前谢谢你。
PS:如果有帮助,我正在使用 Postgres、NodeJS 和 Prisma。
你应该使用聚合。目前尚不清楚您的数据究竟是什么样子以及您希望结果是什么样子。例如,如果您只想要 metadata
中的 bpm
列(正如您的结果所暗示的那样),那么这会将该值放入名为 metadata
:
的数组列中
SELECT t.track_id, t.name,
ARRAY_AGG(m.bpm) as metadata
FROM tracks t LEFT JOIN
metadata m
ON m.track = t.id
WHERE t.id > 5
GROUP BY t.track_id, t.name;
如果需要额外的列,可以将整个记录放入数组中:
ARRAY_AGG(m) as metadata
并且 Postgres 也支持所有这些 JSON 函数。
我有两个 table。曲目和元数据。轨道可以有多个元数据属性,但元数据只能附加到单个轨道。元数据 table 具有轨道 ID 的外键,但轨道 table 没有元数据的外键。我正在尝试找到获得此结果的最佳方法:
[{
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
},
...
]
}]
本质上,我正在尝试获取多个曲目,每个曲目都有多个元数据属性。我能想到的唯一方法是先查询曲目
SELECT * FROM tracks;
然后在后端,为每个返回的曲目发送另一个查询
SELECT * FROM metadata WHERE track=?
在不向数据库发送大量查询的情况下,这样做的更好方法是什么?
我也尝试过 JOIN ,例如:
SELECT * FROM tracks LEFT JOIN metadata ON metadata.track = track.id WHERE track.id>5 LIMIT 10 ;
但这需要在后端对其进行解析并检查每一行以查看其是否具有相同的轨道 ID,并且总体上看起来也很缓慢且次优。
有没有更好的方法,这里的最佳做法是什么?提前谢谢你。
PS:如果有帮助,我正在使用 Postgres、NodeJS 和 Prisma。
你应该使用聚合。目前尚不清楚您的数据究竟是什么样子以及您希望结果是什么样子。例如,如果您只想要 metadata
中的 bpm
列(正如您的结果所暗示的那样),那么这会将该值放入名为 metadata
:
SELECT t.track_id, t.name,
ARRAY_AGG(m.bpm) as metadata
FROM tracks t LEFT JOIN
metadata m
ON m.track = t.id
WHERE t.id > 5
GROUP BY t.track_id, t.name;
如果需要额外的列,可以将整个记录放入数组中:
ARRAY_AGG(m) as metadata
并且 Postgres 也支持所有这些 JSON 函数。