11

有一个面试测试,下面是表格和结构

 Table Person = id, name, dob, dod, mother_id, father_id
 Primary Key (id)
 Foreign Key mother_id references Person
 Foreign Key father_id references Person

有人问

  1. “选择所有的母亲”
  2. “选择那些是 'John Smith' 和 'Jane' 的孩子的孩子

我很困惑,因为我假设外键会像往常一样与其他表链接。但那时我失败了。有人知道实际的答案和原因吗?

4

5 回答 5

15

这种数据结构称为“自引用表”

SELECT DISTINCT mothers.*
FROM person
    inner join person mothers on person.mother_id = mothers.id

SELECT person.*
FROM person
    inner join person fathers on person.father_id = fathers.id
    inner join person mothers on person.mother_id = mothers.id
WHERE 
    fathers.name='john smith'
and 
    mothers.name='jane'
于 2012-10-03T12:38:35.583 回答
2

您始终可以拥有链接到同一个表的外键..这没有问题..

看,假设您在表中存储一个人记录,现在该人将有母亲和父亲。而且mother两者father本身就是一个人..所以,它们本身就是同一张桌子的记录..

假设您在 Person 表中有以下两条记录:-

id     name           age         mother_id
1      xyz            24          5
5      abc            57          6

所以,从上表中你可以看到,personwithid = 5实际上是人的母亲 with id = 1.. 所以,它是一个foreign key引用同一个表..

因此,这里不是对join不同的表执行操作,而是必须对同一个表执行连接。

SELECT p2.id FROM
Person p1 join Person p2
WHERE p1.mother_id = p2.id

此查询将选择mother您当前记录的记录..

于 2012-10-03T12:39:23.290 回答
2

我假设外键会像往常一样与其他表链接。

它仍然是 - 它引用同一个 Person 表中的其他记录。

-- All Mothers
SELECT mom.name
   FROM Person mom
   WHERE EXISTS (SELECT 1 FROM Person WHERE mother_id = mom.id);

-- Children of John Smith and Jane
SELECT kid.name
   FROM Person kid
   INNER JOIN Person mom on kid.mother_id = mom.id
   INNER JOIN Person dad on kid.father_id = dad.id
   WHERE mom.name = 'Jane' AND
   dad.name = 'John Smith';

看看这个SQL fiddle here

于 2012-10-03T12:48:09.413 回答
1
SELECT * 
FROM Person 
WHERE father_id = (SELECT id FROM Person WHERE name = 'John Smith')
AND    mother_id = (SELECT id FROM Person WHERE name = 'Jane')
于 2012-10-03T12:42:24.610 回答
1

podiluska 已经给出了答案,只是解释了它是如何工作的,因为看起来你是 MySql 的新手。

通过给表赋予别名(如表人的母亲或父亲),您可以执行类似于伪表的操作,MySql 将其解释为另一个表,因此连接正常进行,想象一下现在有 3 个表。Person、Father 和 Mother,它们都通过 join 连接在一起。

于 2012-10-03T12:46:28.107 回答