查询 - 从 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 个表中获取结果