我有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。
更新:表格结构。
答案 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)
有两种技术可以帮助您,它们在
下的信息标签中进行了解释class-table-inheritance shared-primary-key
您当前的设计反映了类表继承的大部分内容。什么共享主键会给你买 是能够强制学生与人之间,教师与人之间关系的一对一性质。它不会强制教师和学生之间的互斥关系。
使用两个联接和一个联合,您可以将这三个表组合到一个捕获所有这些数据的视图中,在不适用的地方使用NULL。