Это расширение от another question I just asked. Я узнал, как правильно написать SQL-запрос, чтобы получить желаемый результат, который мне нужен. Но когда я попытался применить его к моему фактическому использованию, я нашел что-то еще, что мне нужно.Добавить child rank to SQL result
Это упрощенная версия таблицы, у меня есть:
+-----+-------------+-----------+
| id | name | parent_id |
+-----+------------+-----------+
| 1 | Bob | 3 |
| 2 | John | 5 |
| 3 | Larry | 4 |
| 4 | Kevin | 0 |
| 5 | Kyle | 0 |
| 6 | Jason | 5 |
| 7 | Mildred | 4 |
| 8 | Mabel | 6 |
| 9 | Amber | 4 |
| 10 | Devon | 5 |
| 11 | Zack | 0 |
| 12 | Alfred | 11 |
| 13 | Robert | 11 |
| 14 | Keith | 11 |
+----+-------------+-----------+
(я добавил несколько больше, так как мой последний вопрос, просто так есть больше примеров) Теперь я хотел, чтобы иметь возможность получить списки родителей, детей и внуков. Вот запросы, которые я нашел, чтобы получить те:
Бабушки
SELECT name FROM people WHERE parent_id = 0
Дети
SELECT c.name
FROM people p
JOIN people c ON c.parent_id = p.id
WHERE p.parent_id = 0
И внуки
SELECT gc.name
FROM people p
JOIN people c ON c.parent_id = p.id
JOIN people gc ON gc.parent_id = c.id
WHERE p.parent_id = 0
Я пытаюсь выяснить что-то для детей, поэтому я оставлю остальных на данный момент. Этот запрос выше для детей дает следующий результат:
+---------+
| name |
+---------+
| John |
| Larry |
| Jason |
| Mildred |
| Amber |
| Devon |
| Alfred |
| Robert |
| Keith |
+---------+
это хорошо, но мне нужно заказать первый в алфавитном порядке первого родителем, то второй ребенком. Так что я добавить ORDER BY на мой запрос:
SELECT c.name
FROM people p
JOIN people c ON c.parent_id = p.id
WHERE p.parent_id = 0
ORDER BY p.name, c.name
Который дает мне:
+---------+
| name |
+---------+
| Amber |
| Larry |
| Mildred |
| Devon |
| Jason |
| John |
| Alfred |
| Keith |
| Robert |
+---------+
Хорошо. Но теперь проблема в том, что я также хотел бы включить родителей в этот список, прямо вверху, где находятся их дети. Кроме того, я хотел бы каким-то образом показать, является ли результат родителем или дочерним. Поэтому я думал о другом столбце под названием Rank
, который имел бы значения 1 или 2, чтобы указать родительский или дочерний. Таким образом, это результат, который я хочу вернуть:
+--------+------+
| name | rank |
+--------+------+
| Kevin | 1 |
| Amber | 2 |
| Larry | 2 |
| Mildred| 2 |
| Kyle | 1 |
| Devon | 2 |
| Jason | 2 |
| John | 2 |
| Zack | 1 |
| Alfred | 2 |
| Keith | 2 |
| Robert | 2 |
+--------+------+
Это имеет смысл? Какой запрос я могу использовать для получения этого результата?
Если он работает для вас: Это проще, чтобы отобразить родительский рядом с ребенком в отдельной колонке. Вы бы просто добавили «p.name как родительский» и получили свои результаты. –
Ваши три примера запросов, чтобы получить бабушек и дедушек, детей и внуков, ясно демонстрируют, как быстро растет сложность, когда дело касается графических структур. По этой причине я настоятельно рекомендую вам взглянуть на такие технологии, как графические базы данных, такие как neo4j – Jacobian
@NorbertvanNobelen Хорошо, спасибо. Это работает. Но мне также нужно включить родителей в список имен. Как я мог это сделать? И для этих элементов в столбце «родители» я бы просто хотел, чтобы это было «NULL» – eshellborn