将 array_agg 中的数组合并为一个数组
Merging arrays from array_agg into a single array
我有一个包含 videos
、shots
和 labels
的数据模型。一个视频由多个镜头组成(一对多),一个片段可以包含多个标签(多对多)。
我正在尝试创建一个搜索视图,可以在其中按标签查找视频,如果任何镜头包含标签,则应返回视频。
镜头和标签通过关联关联 table label_occurrences
(shot_id
, label_id
).
我已经能够使用 array_agg
:
列出视频片段和其中包含的标签
select
video_id, video_name, shot_id, shot_labels
from
videos
inner join shots using (video_id)
inner join (
select shot_id, array_agg(labels.label_name) shot_labels
from label_occurrences
inner join labels using (label_id)
group by shot_id
) x using (shot_id)
group by video_id, shot_id, shot_labels
VID1 | Video1 | Shot1 | {label1,label2}
VID1 | Video1 | Shot2 | {label3}
但我想要的是每个镜头的标签数组的并集
VID1 | Video1 | { label1,label2,label3 }
唉,我完全太基础的 SQL 技能开始让我失望,到目前为止其他文章似乎与我做的不完全一样(我很确定很多人-许多关系是这里的罪魁祸首)。
谁能教教我?
基本上就是:
SELECT v.video_id, v.video_name, array_agg(l.label_name) AS shot_labels
FROM videos v
JOIN shots s USING (video_id)
JOIN label_occurrences lo USING (shot_id)
JOIN labels l USING (label_id)
GROUP BY 1;
简化的GROUP BY
假定video.video_id是其table的PRIMARY KEY
,所以video_name
也被覆盖了。
我有一个包含 videos
、shots
和 labels
的数据模型。一个视频由多个镜头组成(一对多),一个片段可以包含多个标签(多对多)。
我正在尝试创建一个搜索视图,可以在其中按标签查找视频,如果任何镜头包含标签,则应返回视频。
镜头和标签通过关联关联 table label_occurrences
(shot_id
, label_id
).
我已经能够使用 array_agg
:
select
video_id, video_name, shot_id, shot_labels
from
videos
inner join shots using (video_id)
inner join (
select shot_id, array_agg(labels.label_name) shot_labels
from label_occurrences
inner join labels using (label_id)
group by shot_id
) x using (shot_id)
group by video_id, shot_id, shot_labels
VID1 | Video1 | Shot1 | {label1,label2}
VID1 | Video1 | Shot2 | {label3}
但我想要的是每个镜头的标签数组的并集
VID1 | Video1 | { label1,label2,label3 }
唉,我完全太基础的 SQL 技能开始让我失望,到目前为止其他文章似乎与我做的不完全一样(我很确定很多人-许多关系是这里的罪魁祸首)。
谁能教教我?
基本上就是:
SELECT v.video_id, v.video_name, array_agg(l.label_name) AS shot_labels
FROM videos v
JOIN shots s USING (video_id)
JOIN label_occurrences lo USING (shot_id)
JOIN labels l USING (label_id)
GROUP BY 1;
简化的GROUP BY
假定video.video_id是其table的PRIMARY KEY
,所以video_name
也被覆盖了。