【问题标题】:Getting Parent Child hierarchy获取父子层次结构
【发布时间】:2020-05-29 22:56:52
【问题描述】:

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

数据库和版本:10.4.11-MariaDB

表格脚本:

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');

我已尝试遵循自加入查询,但问题是我无法找到正确的父母,即第一父母的父母(父亲和母亲)。

SELECT t1.name AS lev1, 
       t2.name AS lev2Father, 
       t3.name AS lev2Mother, 
       t4.name AS level3Father, 
       t5.name AS level3Mother, 
       t6.name AS level4Father, 
       t7.name AS level4Mother, 
       t8.name AS level5Father, 
       t9.name AS level5Mother, 
       t10.name AS level6Father, 
       t11.name AS level6Mother 
FROM dogs AS t1 
LEFT JOIN dogs AS t2 ON t2.dog_id = t1.father_id 
LEFT JOIN dogs AS t3 ON t3.dog_id = t1.mother_id 
LEFT JOIN dogs AS t4 ON t4.dog_id = t2.father_id 
LEFT JOIN dogs AS t5 ON t5.dog_id = t2.mother_id 
LEFT JOIN dogs AS t6 ON t6.dog_id = t4.father_id 
LEFT JOIN dogs AS t7 ON t7.dog_id = t4.mother_id 
LEFT JOIN dogs AS t8 ON t8.dog_id = t6.father_id 
LEFT JOIN dogs AS t9 ON t9.dog_id = t6.mother_id 
LEFT JOIN dogs AS t10 ON t10.dog_id = t8.father_id 
LEFT JOIN dogs AS t11 ON t11.dog_id = t8.mother_id 
WHERE t1.dog_id = 7

【问题讨论】:

  • CREATE TABLE + INSERT INTO 脚本替换源数据screenshon。显示想要的结果。并指定 MySQL 版本。
  • 好吧,现在给出一些示例数据作为 INSERT INTO 查询此数据的期望结果。并至少指定 MySQL subversion (5.0?5.5?5.7?)。
  • 具体问题出在哪里?到目前为止,我们知道您想让父母从这张表中深入 5 层,但是您遇到了什么困难?
  • 嗨,我已经更新了问题,

标签: hierarchy adjacency-list mariadb-10.4


【解决方案1】:
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;

fiddle

结果

dog_id | name     | father_id | mother_id | level | relation
-----: | :------- | --------: | --------: | ----: | :-------
     7 | GrandSon |         5 |         6 |     0 |         
     5 | Son      |         1 |         2 |     1 | father  
     6 | Daughter |         3 |         4 |     1 | mother  
     1 | Father   |      null |      null |     2 | father  
     3 | Father1  |      null |      null |     2 | father  
     2 | Mother   |      null |      null |     2 | mother  
     4 | Mother2  |      null |      null |     2 | mother  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 2011-04-23
    • 1970-01-01
    • 1970-01-01
    • 2015-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多