MySql:Select 个条目在联结 table 中具有相同的依赖关系
MySql: Select entries with same dependencies in junction table
这些是我的表格:
language language_person person
+----+----------+ +----+-----------+-----------+ +----+-----------------+
| id | name | | id | languageId| personId | | id | name |
+----+----------+ +----+-----------+-----------+ +----+-----------------+
| 1 | english | | 1 | 1 | 1 | | 1 | luca |
+----+----------+ +----+-----------+-----------+ +----+-----------------+
| 2 | german | | 2 | 2 | 1 | | 2 | sara |
+----+----------+ +----+-----------+-----------+ +----+-----------------+
| 3 | italian | | 3 | 3 | 1 | | 3 | michael |
+----+----------+ +----+-----------+-----------+ +----+-----------------+
| 4 | 3 | 2 |
+----+-----------+-----------+
| 5 | 2 | 3 |
+----+-----------+-----------+
目前我正在使用 JPA 加载一个人和这个人使用的语言列表。
每个人至少会说一种语言。现在我想实现一个查询,让所有的人都说完全相同的语言。如果 'Luca',我会搜索会说英语、德语和意大利语的人。当使用 WHERE languageId IN (1, 2, 3)
之类的查询进行搜索时,我显然会找回至少会说一种语言的所有人。另外,在搜索 'sara' 这样的人时,我会搜索只会说意大利语,不会说其他语言的人。
这完全超出了我的理解范围,因此非常感谢您的帮助。
我认为最简单的方法是使用聚合和window函数:
select id, name
from (select p.id, p.name,
group_concat(lp.languageid order by lp.languageid) as languageids,
max(case when p.name = 'Luca' then group_concat(lp.languageid order by lp.languageid) end) over () as luca_languageids
from language_person lp join
person p
on lp.personid = p.id
group by p.id, p.name
) p
where languageids = luca_languageids;
这些是我的表格:
language language_person person
+----+----------+ +----+-----------+-----------+ +----+-----------------+
| id | name | | id | languageId| personId | | id | name |
+----+----------+ +----+-----------+-----------+ +----+-----------------+
| 1 | english | | 1 | 1 | 1 | | 1 | luca |
+----+----------+ +----+-----------+-----------+ +----+-----------------+
| 2 | german | | 2 | 2 | 1 | | 2 | sara |
+----+----------+ +----+-----------+-----------+ +----+-----------------+
| 3 | italian | | 3 | 3 | 1 | | 3 | michael |
+----+----------+ +----+-----------+-----------+ +----+-----------------+
| 4 | 3 | 2 |
+----+-----------+-----------+
| 5 | 2 | 3 |
+----+-----------+-----------+
目前我正在使用 JPA 加载一个人和这个人使用的语言列表。
每个人至少会说一种语言。现在我想实现一个查询,让所有的人都说完全相同的语言。如果 'Luca',我会搜索会说英语、德语和意大利语的人。当使用 WHERE languageId IN (1, 2, 3)
之类的查询进行搜索时,我显然会找回至少会说一种语言的所有人。另外,在搜索 'sara' 这样的人时,我会搜索只会说意大利语,不会说其他语言的人。
这完全超出了我的理解范围,因此非常感谢您的帮助。
我认为最简单的方法是使用聚合和window函数:
select id, name
from (select p.id, p.name,
group_concat(lp.languageid order by lp.languageid) as languageids,
max(case when p.name = 'Luca' then group_concat(lp.languageid order by lp.languageid) end) over () as luca_languageids
from language_person lp join
person p
on lp.personid = p.id
group by p.id, p.name
) p
where languageids = luca_languageids;