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

同じテーブルにリンクする外部キーをいつでも持つことができます..そこには問題はありません..

ほら、テーブルに人のレコードを保存しているとしましょう。今、その人には母親と父親がいます。そしてmotherfather両方ともそれ自体が人です..したがって、それら自体が同じテーブルのレコードです..

Person テーブルに次の 2 つのレコードがあるとします。 -

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

したがって、上記の表から、personwithは実際には with ..id = 5の人の母であることがわかります。つまり、同じ表を参照しています。id = 1foreign 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フィドルを見てください

于 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 つのテーブルがあると想像してください。人、父、母、そしてそれらはすべてジョインによって結び付けられています。

于 2012-10-03T12:46:28.107 に答える