我有 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;