【问题标题】:MySql: Select entries with same dependencies in junction tableMySql:在联结表中选择具有相同依赖项的条目
【发布时间】:2021-05-06 22:22:58
【问题描述】:

这些是我的桌子:

 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 加载一个人和该人所讲语言的列表。 每个人都至少会说一种语言。现在我想实现一个查询,以获取所有说完全相同且只使用相同语言的人。如果是“卢卡”,我会搜索会说英语、德语和意大利语的人。当使用像WHERE languageId IN (1, 2, 3) 这样的查询进行搜索时,我显然会让所有说至少一种语言的人回来。此外,在搜索“sara”之类的人时,我会搜索只会说意大利语,不会说其他语言的人。

这完全超出我的理解,因此非常感谢任何帮助。

【问题讨论】:

    标签: mysql sql jpa relational-database junction-table


    【解决方案1】:

    我认为最简单的方法是使用聚合和窗口函数:

    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-28
      • 1970-01-01
      • 2018-11-15
      相关资源
      最近更新 更多