在RDBMS中连接带有'condition'的表

时间:2013-10-22 09:00:58

标签: database database-design join

我有3张桌子:

Persons(PersonID, PersonName, PersonAge, PersonType)

Students(StudentID (fk to Persons.PersonID), StudentRank, StudentClassID, ...)

Teachers(TeacherID (fk to Persons.PersonID), TeacherSalary, ...)

一个人只能是一种类型:学生或老师。因此,如果我要列出所有类型的人(学生或老师),我需要检查PersonType of Persons表,然后加入相应的表(学生,教师)?它够好吗?任何人都可以给我一个更好的解决方案吗?

编辑:我使用combo:PHP + MySQL。

更新:表格结构。

3 个答案:

答案 0 :(得分:0)

你可以使用find_in_set而不是你不需要加入这两个表:

select p.Personname 
from students s,persons p
where find_in_set(s.Studentid,p.Personid)

答案 1 :(得分:0)

在...

SELECT * FROM Persons JOIN Students ON Persons.PersonID = Students.StudentID

...将返回任何教师。

因此,您不必对PersonType进行过滤(但可能希望在更复杂的情况下,如果它以有助于提高性能的方式编制索引)。

---编辑---

好的,所以你想把所有东西“塞进”,然后按PersonName排序。您可以通过使用NULL仔细填充两个子表之间的“间隙”来实现此目的:

SELECT *
FROM (
    SELECT Persons.*, StudentRank, StudentClassID, NULL TeacherSalary
    FROM Persons JOIN Students ON Persons.PersonID = Students.StudentID
    UNION ALL
    SELECT Persons.*, NULL StudentRank, NULL StudentClassID, TeacherSalary
    FROM Persons JOIN Teachers ON Persons.PersonID = Teachers.TeacherID
) Q
ORDER BY PersonName

答案 2 :(得分:0)

有两种技术可以帮助您,它们在

下的信息标签中进行了解释

您当前的设计反映了类表继承的大部分内容。什么共享主键会给你买 是能够强制学生与人之间,教师与人之间关系的一对一性质。它不会强制教师和学生之间的互斥关系。

使用两个联接和一个联合,您可以将这三个表组合到一个捕获所有这些数据的视图中,在不适用的地方使用NULL。