Det här är mångsidigt och fult och kommer att gå långsamt, och det är begränsat till fyra generationer, men jag vet inte hur det annars kan göras.
SELECT person_name, parent_name FROM
(SELECT child1.name AS person_name, parent1.name AS parent_name, '1' AS generation
FROM people as child1
JOIN people as parent1
ON child1.parent_person_id = parent1.person_id AND child1.parent_person_id = child1.person_id
UNION
SELECT child2.name AS person_name, parent2.name AS parent_name, '2' AS generation
FROM people as child2
JOIN people as parent2
ON child2.parent_person_id = parent2.person_id AND child2.parent_person_id <> child2.person_id AND parent2.parent_person_id = parent2.person_id
UNION
SELECT child3.name AS person_name, parent3.name AS parent_name, '3' AS generation
FROM people as child3
JOIN people as parent3
ON child3.parent_person_id = parent3.person_id AND parent3.parent_person_id <> parent3.person_id
JOIN people as grandparent1
ON parent3.parent_person_id = grandparent1.person_id AND grandparent1.parent_person_id = grandparent1.person_id
UNION
SELECT child4.name AS person_name, parent4.name AS parent_name, '4' AS generation
FROM people as child4
JOIN people as parent4
ON child4.parent_person_id = parent4.person_id AND parent4.parent_person_id <> parent4.person_id
JOIN people as grandparent2
ON parent4.parent_person_id = grandparent2.person_id AND grandparent2.parent_person_id <> grandparent2.person_id
JOIN people as greatgrandparent
ON grandparent2.parent_person_id = greatgrandparent.person_id AND greatgrandparent.parent_person_id = greatgrandparent.person_id
) AS tree
WHERE generation = ?