获取父子层次结构

时间:2020-02-14 06:43:01

标签: hierarchy adjacency-list mariadb-10.4

我正在尝试将一个孩子(狗)的祖先提高到5级。例如,在所附图片中,我将发送“ Spencer di Casa Massarelli”,结果希望有相关的父母(父亲和母亲) 。在我的数据库结构中,我使用了mother_id和mother_id。

数据库和版本:10.4.11-MariaDB

表脚本:

    <TextBlock Text="Tick above should hide me" Style="{StaticResource style}"/>
CREATE TABLE `dogs` (
  `dog_id` int(11) NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  `father_id` int(11) DEFAULT NULL,
  `moter_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`dog_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

我尝试了以下自联接查询,但是问题是我无法找到合适的父母,即,第一个父母的父母(父亲和母亲)。

INSERT INTO `dogs` VALUES ('0', null, null, null);
INSERT INTO `dogs` VALUES ('1', 'Father', null, null);
INSERT INTO `dogs` VALUES ('2', 'Mother', null, null);
INSERT INTO `dogs` VALUES ('3', 'Father1', null, null);
INSERT INTO `dogs` VALUES ('4', 'Mother2', null, null);
INSERT INTO `dogs` VALUES ('5', 'Son', '1', '2');
INSERT INTO `dogs` VALUES ('6', 'Daughter', '3', '4');
INSERT INTO `dogs` VALUES ('7', 'GrandSon', '5', '6');

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:0)

implementation 'com.android.volley:volley:1.1.1'

fiddle

结果

WITH RECURSIVE
cte AS (
SELECT *, 0 level, '      ' relation
FROM dogs
WHERE dog_id = 7

UNION ALL

SELECT dogs.*, level + 1, 'father'
FROM dogs
JOIN cte ON cte.father_id = dogs.dog_id
WHERE level < 5

UNION ALL

SELECT dogs.*, level + 1, 'mother'
FROM dogs
JOIN cte ON cte.mother_id = dogs.dog_id
WHERE level < 5
)
SELECT *
FROM cte
ORDER BY level, relation;