Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.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
具有无序parentid的mysql分层sql查询_Mysql - Fatal编程技术网

具有无序parentid的mysql分层sql查询

具有无序parentid的mysql分层sql查询,mysql,Mysql,您好,专家们,我有一个节点表,其中包含nodeid和parentid列,我试图以这样一种方式获取所有节点的列表,即父节点列在子节点之前 在本例中,我没有得到节点id 20,21作为结果 我使用的查询是 select nodeid,parentid from (select * from node order by parentid, nodeid) channel_sorted, (select @pv := '0') initialisation where fin

您好,专家们,我有一个节点表,其中包含nodeid和parentid列,我试图以这样一种方式获取所有节点的列表,即父节点列在子节点之前

在本例中,我没有得到节点id 20,21作为结果

我使用的查询是

select  nodeid,parentid from    
(select * from node 
order by parentid, nodeid) channel_sorted,    
(select @pv := '0') initialisation  
where   find_in_set(parentid, @pv)  and   length(@pv := concat(@pv, ',', nodeid))

尝试以下查询,我已经在您提到的sqlfiddle示例上进行了尝试,并且成功了:

SET @position := 0;
select nodeid,parentid from
  (select nodeid,node.parentid from
     (select distinct parentid,(@position := @position + 1) s
         from node) as t inner join node on t.parentid=node.nodeid
     order by s) as f

union

select nodeid,parentid
from node
where nodeid not in (select parentid from node);

尝试以下查询,我已经在您提到的sqlfiddle示例上进行了尝试,并且成功了:

SET @position := 0;
select nodeid,parentid from
  (select nodeid,node.parentid from
     (select distinct parentid,(@position := @position + 1) s
         from node) as t inner join node on t.parentid=node.nodeid
     order by s) as f

union

select nodeid,parentid
from node
where nodeid not in (select parentid from node);

这不管用。它不考虑在子节点
排序依据
变得不相关之前列出父节点。它没有像预期的那样产生效果。请尝试编辑后的答案,我想这就是你想要的。不。它不起作用。检查
19
2296
的顺序。谢谢@Abdo20293,但结果是节点19位于子节点(20,21)之后,而我希望获得第一个父节点,然后是子节点这不起作用。它不考虑在子节点
排序依据
变得不相关之前列出父节点。它没有像预期的那样产生效果。请尝试编辑后的答案,我想这就是你想要的。不。它不起作用。检查
19
2296
的顺序。谢谢@Abdo20293,但结果是节点19位于子节点(20,21)之后,而我希望获得第一个父节点,然后是子节点。您可以提供预期的输出吗?旁注:在分层存储中,父行始终位于子节点之前。也就是说,
parent\u id
如果自身不存在就不能存在。在您的情况下,您是如何得到
(19,'categor19',2296)
?您正面临此问题,因为设计不佳。您仍然可以使用PHP实现这一点。1 0 4 1 5 1 2296 4 19 2296 20 19 21 19Yes@vivek_23,是的,数据就是这样,我需要在子节点之前创建父节点,但查询并没有按照我期望的顺序返回。mysql中没有办法解决这个问题。你能提供你期望的输出吗?旁注:当涉及到分层存储时,父行总是在子行之前。也就是说,
parent\u id
如果自身不存在就不能存在。在您的情况下,您是如何得到
(19,'categor19',2296)
?您正面临此问题,因为设计不佳。您仍然可以使用PHP实现这一点。1 0 4 1 5 1 2296 4 19 2296 20 19 21 19Yes@vivek_23,是的,数据就是这样,我需要在子节点之前创建父节点,但查询并没有按照我期望的顺序返回。mysql中没有解决这个问题的方法吗。