私はSQLを使用して、家系図の情報を格納しています。 生まれの人物の名前を入力して、に生まれたすべての子孫の名前を生年月日Zで出力しますが、の場合は、これらの子孫が兄弟姉妹の場合にのみ )。私は似たような解決策を見つけましたが、これらの解決策が(エイリアシングのために)階層構造では機能しないことが判明しました。また、世代Yで生まれた親とその子供がいるかもしれないので、階層の深さは名前を決定するために信頼できません。階層構造のGROUP BY列と異なるSELECT列
+----+----------+-----------+------------+--------+
| ID | Name | Parent_ID | Generation | Gender |
+----+----------+-----------+------------+--------+
| 1 | John | NULL | X | Male |
| 2 | Jill | 1 | Y | Female |
| 3 | Andy | 2 | Z | Male |
| 4 | Ralph | 2 | Z | Male |
| 5 | Lisa | NULL | X | Female |
| 6 | Steve | 5 | Y | Male |
| 7 | Sean | 6 | Y | Male |
| 8 | Sarah | 6 | Y | Female |
| 9 | Emily | 7 | Z | Female |
| 10 | Matt | 7 | Z | Male |
+----+----------+-----------+------------+--------+
所望の出力:(SET @GenX = 'Lisa';
場合)
+-------+
| Name |
+-------+
| Emily |
| Matt |
+-------+
これは、これまでの私のコードです。
SET @GenX = 'Lisa';
SELECT t2.name AS Kids
FROM (SELECT name, Parent_ID
FROM FamilyTree
WHERE Gender = 'Male' OR Gender = 'Female') t1
LEFT JOIN FamilyTree t2 ON t2.ID = t1.Parent_ID
LEFT JOIN FamilyTree t3 ON t3.ID = t2.Parent_ID
LEFT JOIN FamilyTree t4 ON t4.ID = t3.Parent_ID
WHERE t3.name = '@GenX' OR t4.name - '@GenX'
GROUP BY t2.name
HAVING SUM(t1.Gender) > 0 AND SUM(t1.Gender) > 0;
これは正しい親の名前を返しますが、子供の名前は返しません。もし私がSELECT
とGROUP BY
子供の名前、私は子供が姉/兄弟を持っている見つけることができません。助けてくれてありがとう。私は本当にこれに固執しています。
名前が重複していたり、重複していると思われることはありません。
唯一の世代は3つ以上ですか?テーブルや特定の世代に存在する世代の名前が必要ですか? –
世代が増えているかもしれません。だから、世代Zは重要な停止地点ですが、世代Xよりもずっと大きな木が存在する可能性があります。世代間に生まれた家族系列の人数は可変です(親と子は両方とも生まれるかもしれません – blobberman