过滤多对多关系,其中一个实体与所有其他实体有关系,而不仅仅是一些实体

问题描述 投票:0回答:1

我有2张桌子,比如狗和猫,第三张桌子dog_cats(有dog_id和cat_id)可以处理它们之间的多对多关系。我想做的是检索一个狗列表,并过滤提供的猫ids列表,其中狗返回与所有猫的关系。我让它在所有狗被归还的地方工作,这些狗在进行连接后使用WHERE cat.id = ANY(list_of_cat_ids)与cat id列表至少有一个关系

postgresql
1个回答
0
投票

这是一种相当常见的查询类型,此处继续进行的一种方法是仅通过dog进行聚合,然后断言每个匹配的狗与列表中的每只猫有关系。例如,假设您有一个包含三个猫名称的列表,我们可以尝试以下方法:

SELECT
    d.id,
    d.name
FROM dogs d
INNER JOIN dogs_cats dc
    ON d.id = dc.dog_id
INNER JOIN cats c
    ON dc.cat_id = c.id
WHERE
    c.name IN ('Calico', 'Persian', 'Tabby')
GROUP BY
    d.id,
    d.name
HAVING
    COUNT(DISTINCT c.id) = 3;
© www.soinside.com 2019 - 2024. All rights reserved.