【问题标题】:Join tables with 'condition' in RDBMS在 RDBMS 中使用“条件”连接表
【发布时间】:2013-10-22 09:00:57
【问题描述】:

我有 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。

更新:表格结构。

【问题讨论】:

  • 您真的需要学生/教师表中的任何东西吗?如果没有,请不要担心 - 您可以使用 PersonType 上的 case 语句从 Persons 表中进行选择,或者如果您有一个列出类型的 PersonType 表,则可以连接到另一个表。

标签: database database-design join


【解决方案1】:

...

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

【讨论】:

  • 感谢您的回答。但是如果我想列出所有类型的人(当然还有类型的属性)并按人名排序,例如"Alice [Student, Rank: 12, Class: 321], Bob [Teacher, Salary: 1200$], Thomas [Student, Rank: 30, Class: 128]"...在实践中我怎样才能清楚地做到这一点?
  • @JackCood 只需针对每种类型的人分别查询即可。学生和教师有不同的列,因此不能在一个查询中将它们联合在一起(好吧,无论如何都不是很自然的方式)。
  • 所以我只能按类型列出人员?我不能按名称订购所有产品?
  • 你能给我一个更好的设计吗?
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-02-15
      • 1970-01-01
      • 1970-01-01
      • 2020-07-25
      • 2016-10-13
      • 2022-01-08
      • 2011-06-25
      • 2014-01-02
      • 1970-01-01
      相关资源
      最近更新 更多