【问题标题】:将 array_agg 中的数组合并到一个数组中
【发布时间】:2022-01-18 17:47:09
【问题描述】:

我有一个包含videosshotslabels 的数据模型。一个视频由多个镜头(一对多)组成,一个片段可以包含多个标签(多对多)。 我正在尝试创建一个搜索视图,可以在其中按标签查找视频,如果任何镜头包含标签,则应返回视频。 镜头和标签通过关联表 label_occurrencesshot_idlabel_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 技能开始让我失望了,到目前为止,其他文章似乎并没有和我做的完全一样(我很确定多对多关系是罪魁祸首在这里)。

也许有人可以启发我?

【问题讨论】:

  • 标签可以重复吗?如果是这样,你想要一组独特的标签吗?有什么特别的顺序吗?您的 Postgres 版本?

标签: postgresql aggregate-functions


【解决方案1】:

基本上只是:

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 是其表的PRIMARY KEY,因此video_name 也被覆盖。

【讨论】:

    猜你喜欢
    • 2019-03-14
    • 2020-10-08
    • 1970-01-01
    • 2020-02-02
    • 2022-09-27
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    相关资源
    最近更新 更多