查询 - 从 3 个表连接

Posted

技术标签:

【中文标题】查询 - 从 3 个表连接【英文标题】:Query - Join from 3 tables 【发布时间】:2016-02-11 04:28:56 【问题描述】:

我需要从 3 张表 Professor 、 teacher 和 students 中进行连接查询。每个教授都有一个教师名单,每个教师都有一个学生名单。我正在开发一个 Web 服务,它只会给我教授 ID,并且基于我需要为这个特定教授获取所有学生。所以我需要先得到老师的名单,然后我才能得到所有的学生。 任何人都可以在这方面提供帮助吗?我不想使用级联选择。我想使用 JOIN FETCH,因为我使用的是 jpa。

表教授:教授id、教授姓名、教授地址

Table Teacher : Teacher id , Professor id, Teacher name

学生表:学生编号、教师编号、学生姓名、学生地址

【问题讨论】:

请提供表格的架构,以便人们能够更好地理解您的问题。 【参考方案1】:

这是满足您要求的 JPA 查询。 请注意,StudentModel 应映射到学生表。 StudentModel 应该有一个属性“teacher”,它是“TeacherModel”类型。 TeacherModel 应该具有类型为“ProferssorModel”的“professor”属性,那么只有这个才有效。

<query name="findStudentsByProfessorID">
    <query-param name="professorId" type="Long" />
        SELECT student 
        FROM StudentModel student
        inner join fetch student.teacher teacher
        inner join fetch teacher.professor professor
        WHERE professor.id = :professorId

</query>

或者使用sql命名查询也可以。

<sql-query name="findStudentsByProfessorID">
    <query-param name="professorid" type="long" />
    <![CDATA[
        select * from student s join teacher t 
        on s.teacherid = t.teacherid where t.professorid = :professorid;
    ]]>
</sql-query>

【讨论】:

【参考方案2】:

由于您没有提到表结构,因此最简单的查询将是执行以下操作,假设您将teacherid 作为学生表中的外键,将professorid 作为教师表中的外键:

Select * from student s 
  where s.teacherid in 
     (select t.teacherid from teacher t where t.professorid = 1);

使用子查询/级联选择的替代方法是使用连接。

select * from student s join teacher t 
    on s.teacherid = t.teacherid where t.professorid = 1;

【讨论】:

是的,我有你提到的教授 ID 和教师 ID。谢谢。但是除了级联选择还有其他选择吗? 您希望避免级联选择的任何特殊原因? 它在我的 jpa 类中不起作用。你知道如何使用 JOIN fetch 吗? 我没有在 jpa 上工作过。您可能可以尝试@Sudhakar 建议的解决方案

以上是关于查询 - 从 3 个表连接的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.3 查询从通过外键连接的 4 个表中获取结果

MongoDB中的3个表连接

SQL怎么连接查询2个表?

PHP Codeigniter MySQL 查询 - 将 4 个表连接在一起,其中 3 个表使用每个表中的一列分组

SQL怎么连接查询2个表?

使用 graphql 查询连接 3 个表