使用单人表来存储和显示相关的家庭成员

时间:2012-05-24 08:57:58

标签: mysql join relationship create-table

我想创建一个使用以下表返回父级及其监护人的查询。我的问题是如何在person表中使用name属性两次来返回看护者的姓名和父母的姓名。任何示例代码将不胜感激。我知道我没有解释得很好,但如果有人理解我的意思,可以随意编辑上述内容。更具体地说,我想只使用person表来存储关于父母及其子女的信息,并使用显示每个相关人员的姓名。如何使用单个表格执行此操作。

enter image description here

使用提供的一些建议,我能够创建查询,但由于我的表有问题,它不起作用。我使用下表:

CREATE TABLE Person
(
personID INT NOT NULL,
name VARCHAR(50),
address VARCHAR(70),
phone VARCHAR(15),
email VARCHAR(30),
year INT,
PRIMARY KEY (personID)
);

CREATE TABLE Guardian
(
parentID INT NOT NULL,
childID INT NOT NULL,
PRIMARY KEY (parentID, childID)
FOREIGN KEY (parentID) REFERENCES (personID),
FOREIGN KEY (childID) REFERENCES (personID)
);

我应该使用哪些陈述来使其正常工作。我认为问题是两个外键语句都指的是person表中的相同键。在查找父级和子级时如何引用相同的属性而不会出现任何错误。

3 个答案:

答案 0 :(得分:1)

SELECT
    Child.name AS ChildName,
    Parent.name AS ParentName
FROM Guardian
    INNER JOIN Person AS Child ON Child.personID = Guardian.childID
    INNER JOIN Person AS Parent ON Parent.personID = Guardian.parentID

这将为每个父/子对返回一行。

重要的特性是引用Person表两次,但在每种情况下都给它一个不同的别名。然后,您可以在两个不同的角色中引用该表。输出列也可以别名,以区分连接表的两个实例中的同一列。

答案 1 :(得分:0)

你没有提到,但假设一个人只能有一个监护人,我认为你不需要两张桌子。

只需在Person表上添加一个映射到自身的guardianID。所以你会有这样的东西

Person
ID   name        GuardianID
1    The Father     null
2    The Son         1

所以,如果你想了解一个人及其监护人,你可以做到

select *, (select p2.name from person wherep2.id=p.guardianid)
from person p
where p.id=2

答案 2 :(得分:0)

首先修复你的创建表:

CREATE TABLE Guardian
(
parentID INT NOT NULL,
childID INT NOT NULL,
PRIMARY KEY (parentID, childID),
FOREIGN KEY (parentID) REFERENCES Person(personID),
FOREIGN KEY (childID) REFERENCES Person(personID)
);

然后查询:

SELECT
  p.name as parentName,
  c.name as childName,
  Guardian.*
FROM Person AS p
  INNER JOIN Guardian ON p.PersonID=Guardian.parentID
  INNER JOIN Person AS c ON c.PersonID=Guardian.childID
WHERE
  -- whatever you want, e.g.
  p.Name='John'