在我的数据库中,timeline_items
表与tags
具有多对多关系,由timeline_items_tags
表加入。如果给出了标签ID列表,我希望能够找到与所有这些标签相关联的TimelineItem。例如,让我说我有一个与标签20和10相关联的TimelineItem。鉴于以下查询,我希望这些结果:
[20, 10] -> OK!
[20] -> OK!
[20, 10, 33] -> NOT OK
鉴于这些要求,我试图编写一个查询:
join(TimelineItem, :inner, [ti], tag in "timeline_items_tags", tag.timeline_item_id == ti.id and tag.tag_id in ^tag_ids) |>
group_by([ti], ti.id) |>
having([ti, tag], fragment("array_agg(?)", tag.tag_id) in ^tag_ids)
第一行加入任何匹配甚至单个标记的timeline_items_tags
,这太过宽松了。因此,为了确保所有标记都存在,我尝试对TimelineItem进行分组并创建其tag_id
的数组。不幸的是,最后一行抛出:
could not find array type for data type bigint[]
发生了什么?有没有更好的方法来解决这个问题?
答案 0 :(得分:0)
我很亲密。需要实际结束这一行:
having([ti, tag], fragment("? <@ array_agg(?)", ^tag_ids, tag.tag_id))