首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在RDBMS中使用“条件”连接表

问在RDBMS中使用“条件”连接表
EN

Stack Overflow用户
提问于 2013-10-22 09:00:57
回答 3查看 129关注 0票数 1

我有三张桌子:

代码语言:javascript
复制
Persons(PersonID, PersonName, PersonAge, PersonType)

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

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

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

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

更新:表的结构。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-10-22 09:10:02

那个..。

代码语言:javascript
复制
SELECT * FROM Persons JOIN Students ON Persons.PersonID = Students.StudentID

...will,,not,,返回任何老师。

因此,您不必在PersonType上进行筛选(但在更复杂的情况下,如果索引的方式有助于性能的话)。

--编辑--

好的,所以你想把所有东西“塞”在一起,然后在PersonName上排序。您可以通过使用NULL仔细填充两个子表之间的“空白”来做到这一点:

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2013-10-22 09:07:31

您可以使用find_in_set,而不必加入这两个表:

代码语言:javascript
复制
select p.Personname 
from students s,persons p
where find_in_set(s.Studentid,p.Personid)
票数 0
EN

Stack Overflow用户

发布于 2013-10-22 12:03:24

有两种技术可以帮助您,它们将在下面的info选项卡中解释。

类表继承 共享主键

当前的设计反映了很多类表继承。分享主钥匙给你买到的是加强学生与人之间、教师与人之间的一对一关系的能力。它不会使师生之间形成一种相互排斥的关系。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19513423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档