具有1:n关系的SQL查询,查找具有两个匹配子项匹配的所有实体
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了具有1:n关系的SQL查询,查找具有两个匹配子项匹配的所有实体相关的知识,希望对你有一定的参考价值。
我有一个简单的父子关系(1:n,@ OneToMany),由JPA映射。
儿童(以及其他)具有以下属性:
- 用户
- 类型
我现在想要找到所有父元素,这些元素至少包含以下两个子元素:
- 第一个使用user ='user1'且type ='type1'AND的子节点
- 用户='user2'并输入=='type2'OR的第二个孩子
- 第一个孩子,用户='user1',输入='type2'AND
- user ='user2'且type ='type1'的第二个孩子
例如。一个实体可以有10个孩子,但其中两个必须符合上述标准。
您是否有任何提示如何使用SQL / JPA Criteria API进行处理?
EXISTS子句是否可行,如下所示:
SELECT * FROM Parent parent
WHERE EXISTS (SELECT child FROM Child WHERE (child.user = 'user1' AND child.type = 'type1' OR ...) AND child.id=parent.id)
OR
EXISTS (SELECT child FROM Child WHERE (child.user = 'user1' AND child.type = 'type2' OR ...) AND child.id=parent.id)
谢谢你的帮助!
更新:父代表一个“邮件”,子关系代表邮件的发件人和收件人,如下所示:
Parent Table (Mail):
|id | subject |
|1 | Hello World |
|2 | Foo Bar |
|3 | Example |
|4 | Test |
Child Table:
|id | user | type |
|1 | user1@mail| SENDER |
|1 | user2@mail| RECEIVER |
|1 | user3@mail| RECEIVER |
|2 | user1@mail| SENDER |
|2 | user4@mail| RECEIVER |
|2 | user5@mail| RECEIVER |
|3 | user2@mail| SENDER |
|3 | user1@mail| RECEIVER |
|3 | user5@mail| RECEIVER |
|4 | user3@mail| SENDER |
|4 | user1@mail| RECEIVER |
|4 | user2@mail| RECEIVER |
子表的主键是(id,user,type)的复合键。 id列是1:n关系的连接列。
我想找到所有邮件,这些邮件由user1发送并由user2接收,反之亦然,例如两个用户之间交换的邮件。
示例输入:'user1','user2'结果:邮件1和3,但不是邮件4,因为在邮件4中,两个用户都只是接收者。
答案
一个巧妙的诀窍是计算父母所拥有的独特孩子的数量:
SELECT *
FROM parent p
WHERE EXISTS (SELECT child_id
FROM child c
WHERE user IN ('user1', 'user2') AND
type IN ('type1', 'type2') AND
c.parent_id = p.id
GROUP BY child_id
HAVING COUNT(DISTINCT user) = 2 AND
COUNT(DISTINCT type) = 2)
以上是关于具有1:n关系的SQL查询,查找具有两个匹配子项匹配的所有实体的主要内容,如果未能解决你的问题,请参考以下文章