我有三张桌子:
Persons(PersonID, PersonName, PersonAge, PersonType)
Students(StudentID (fk to Persons.PersonID), StudentRank, StudentClassID, ...)
Teachers(TeacherID (fk to Persons.PersonID), TeacherSalary, ...)一个人只能是一种类型:学生或教师。因此,如果我想列出所有的人类型(学生或教师),我需要检查PersonType的人表,然后加入相应的表(学生,教师)?够好了吗?有人能给我一个更好的解决方案吗?
编辑:我使用组合体: PHP + MySQL。
更新:表的结构。
发布于 2013-10-22 09:10:02
那个..。
SELECT * FROM Persons JOIN Students ON Persons.PersonID = Students.StudentID...will,,not,,返回任何老师。
因此,您不必在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-22 09:07:31
您可以使用find_in_set,而不必加入这两个表:
select p.Personname
from students s,persons p
where find_in_set(s.Studentid,p.Personid)发布于 2013-10-22 12:03:24
有两种技术可以帮助您,它们将在下面的info选项卡中解释。
类表继承 共享主键
当前的设计反映了很多类表继承。分享主钥匙给你买到的是加强学生与人之间、教师与人之间的一对一关系的能力。它不会使师生之间形成一种相互排斥的关系。
使用两个联接和一个联合,您可以将这三个表组合成捕获所有这些数据的视图,在不适用的地方使用NULL。
https://stackoverflow.com/questions/19513423
复制相似问题