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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了过滤多对多关系,其中一个实体与所有其他实体有关系,而不仅仅是一些实体相关的知识,希望对你有一定的参考价值。

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

答案

这是一种相当常见的查询类型,此处继续进行的一种方法是仅通过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;

以上是关于过滤多对多关系,其中一个实体与所有其他实体有关系,而不仅仅是一些实体的主要内容,如果未能解决你的问题,请参考以下文章

用于多对多关系的 NSPredicate 过滤器

JPA多对多映射

EF Core 过滤掉多对多关系中的重复实体

同一实体之间的一对多和多对多关系

JPA - 一个实体如何引用多对多关系中涉及的两个其他实体?

TypeORM:如何查询与字符串数组输入的多对多关系以查找所有字符串都应存在于相关实体列中的实体?