1

我有 3 张桌子:

Persons(PersonID, PersonName, PersonAge, PersonType)

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

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

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

编辑:我使用组合:PHP + MySQL。

更新:表的结构。

4

3 回答 3

0

有两种技术可以帮助您,它们在信息选项卡下的说明中进行了说明

您当前的设计反映了大部分类表继承。共享主键将为您带来的是执行学生与人之间以及教师与人之间关系的一对一性质的能力。它不会强制在教师和学生之间建立相互排斥的关系。

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

于 2013-10-22T12:03:24.247 回答
0

您可以使用find_in_set不需要加入两个表:

select p.Personname 
from students s,persons p
where find_in_set(s.Studentid,p.Personid)
于 2013-10-22T09:07:31.890 回答
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
于 2013-10-22T09:10:02.250 回答