Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql-如何选择子列表的所有父级?_Mysql_Sql - Fatal编程技术网

Mysql-如何选择子列表的所有父级?

Mysql-如何选择子列表的所有父级?,mysql,sql,Mysql,Sql,我有一个表,其中每个记录都包含他的父亲,这个层次结构最多可以有6个级别。下面的查询将搜索名为department bao的部门的所有父级。这个查询非常有效 SELECT D2.id, D2.name, D2.id_parent FROM ( SELECT @d AS _id, (SELECT @d := id_parent FROM department WHERE id = _id) AS id_parent, @l := @l + 1

我有一个表,其中每个记录都包含他的父亲,这个层次结构最多可以有6个级别。下面的查询将搜索名为department bao的部门的所有父级。这个查询非常有效

SELECT D2.id, D2.name, D2.id_parent
FROM (
    SELECT
        @d AS _id,
        (SELECT @d := id_parent FROM department WHERE id = _id) AS id_parent,
        @l := @l + 1 AS level
    FROM
        (SELECT 
            @d := (select id from department where name = 'DEPARTMENT ABCD'), 
            @l := 0
        ) initial_level,
        department D
    WHERE @d <> 0
) D1
JOIN department D2 ON D1._id = D2.id
ORDER BY D1.level DESC;
但是,如果我想在下面的查询中使用like同时获得多个孩子的父母,我会得到错误:错误代码:1242。子查询返回多行

带有错误子查询的查询返回多行:

SELECT D2.id, D2.name, D2.id_parent
FROM (
    SELECT
        @d AS _id,
        (SELECT @d := id_parent FROM department WHERE id = _id) AS id_parent,
        @l := @l + 1 AS level
    FROM
        (SELECT 
            @d := (select id from department where name like 'DEPARTMENT %A%'), 
            @l := 0
        ) initial_level,
        department D
    WHERE @d <> 0
) D1
JOIN department D2 ON D1._id = D2.id
ORDER BY D1.level DESC;
我怎样才能同时得到多个孩子的父母呢


我在SQL Fiddle中添加了一个示例:

鉴于层次结构最多可能有6个级别,我建议加入表6次,以获得所选部门的所有祖先:

select     distinct id, name, id_parent
from       (
            select      d6.id_parent as id6,
                        d5.id_parent as id5,
                        d4.id_parent as id4,
                        d3.id_parent as id3,
                        d2.id_parent as id2,
                        d1.id_parent as id1,
                        d1.id        as id0
            from        department d1
            left join   department d2 on d2.id = d1.id_parent 
            left join   department d3 on d3.id = d2.id_parent 
            left join   department d4 on d4.id = d3.id_parent  
            left join   department d5 on d5.id = d4.id_parent  
            left join   department d6 on d6.id = d5.id_parent
            where       d1.name like 'DEPARTMENT A%'
           ) as h
inner join department d on d.id in (id0, id1, id2, id3, id4, id5, id6)
order by   1;

如果我得到了你,你想显示一个层次结构的项目。如果是这样的话,你可以考虑选择一个递归方法。我看到了通知链接和描述的方法以列的形式显示级别,也不支持查找多个孩子的父母。您是否会创建一个小的数据样本,甚至是一个假数据,以便我们可以测试结果?。你好,乔治。我制作了一个小提琴样品。如果使用上面的查询,将能够模拟这种情况。提前谢谢你!该特定错误消息表示您正在运行一个只能返回一行数据的查询,例如您的@d:=select id。。。。因为你在做赋值,所以只能赋值一个值,而不是一组值。太好了,谢谢!它工作得很好!我唯一关心的是,对于包含数千条记录的连接,查询是否会有点慢。你认为你可以带来一个性能问题,或者它无论如何都会很好地工作?提前谢谢你!我不认为表现会成为问题。实际上,我认为原始SQL中的相关子查询可能更像是一个性能消耗,从id=\U id所在的部门中选择@d:=id\U父项。但这只是我的直觉,我可能错了。好吧,我明白了。非常感谢您的帮助和澄清!!=]