MYSQL没有重复的行 - 具有多个父级的多对多层次结构

时间:2016-10-16 15:52:44

标签: mysql sql database

我正在尝试创建层次结果集。表中的示例记录。 在下面的输出中,我在第二列(root)中没有父名,同样,我有22个父母(根!没有超级父母)。

Child Name Parent
-----------------
1     A    1-3 
2     B    1-3
3     C    1-3
1-3   D    1-10
3-5   E    1-10
6-10  F    1-10
1-10  G   1-100
201   w   200-210
202   x   200-210
203   y   200-210
200-210 z 200-300

我的代码:在这里,我已经编写了3次Mysql连接查询以获得4个级别。

SELECT 
t1.Child ,
t1.Name ,
t2.Child ,
t2.Name ,
t3.Child ,
t3.Name,
t4.Child ,
t4.Name
FROM
code t1
left join code  t2 on  t1.Child = t2.Parent
left join code  t3 on  t2.Child  = t3.Parent
left join code  t4 on  t3.Child = t4.Parent

输出:

t1.Child t1.Name t2.Child t2.Name t3.Child t3.Name t4.Child t4.Name
-------------------------------------------------------------------   
1-100    root    1-10        G   1-3       D            1    A 
1-100    root    1-10        G   1-3       D            1    B
1-100    root    1-10        G   1-3       D            1    C
1-10      G      1-3       D       1       A
1-10      G      1-3       D       1       B
1-10      G      1-3       D       1       C
1-3       D      1         A
1-3       D      1         B
1-3       D      1         C
200-300   root  200-210    z     201       w 
200-300   root  200-210    z     202       x 
200-300   root  200-210    z     203       y 
200-210    z     201       w 
200-210    z     202       x 
200-210    z     203       y

我只是想要第1到3行& 10 - 12,

我正在寻找像

这样的行

Grand Parents1(Root)给大孩子们

Grand Parents2(Root)给大孩子们

但不是第4 - 9行& 13 - 15因为信息是重复的,我已经在第3,4,5,6 ......等等中有这些信息。

我不希望再次重复行

例外输出:

t1.Child t1.Name t2.Child t2.Name t3.Child t3.Name t4.Child t4.Name
-------------------------------------------------------------------   
1-100    root    1-10        G   1-3       D            1    A 
1-100    root    1-10        G   1-3       D            1    B
1-100    root    1-10        G   1-3       D            1    C
200-300   root  200-210    z     201       w 
200-300   root  200-210    z     202       x 
200-300   root  200-210    z     203       y 

由于

1 个答案:

答案 0 :(得分:0)

你走在正确的轨道上。您可以在exists子句中使用where

SELECT t1.Child, t1.Name, t2.Child, t2.Name,
       t3.Child, t3.Name, t4.Child, t4.Name
FROM code t1 LEFT JOIN
     code t2 on t1.Child = t2.Parent LEFT JOIN
     code t3 on t2.Child = t3.Parent LEFT JOIN
     code t4 on t3.Child = t4.Parent
WHERE NOT EXISTS (SELECT 1
                  FROM code c
                  WHERE c.Child = t1.Parent
                 );

这将只返回以root开头的行。

在您的情况下,您还可以更简单地执行:

WHERE t1.Name = 'root'

如果您愿意。