筛选多对多关系,其中一个实体与所有其他实体(而不仅仅是某些实体)有关系



我有 2 个表,比如狗和猫,还有第三个表dogs_cats(带有 dog_id 和 cat_id(,用于处理它们之间的多对多关系。我想做的是检索狗的列表,并过滤提供的猫ID列表,其中返回的狗与所有猫都有关系。我让它在返回所有狗的地方工作,这些狗在加入后使用 WHERE cat.id = ANY(list_of_cat_ids) 与猫 ID 列表至少有一个关系

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

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;

相关内容

最新更新