【问题标题】:mysql hierarchical sql query having unordered parentid具有无序parentid的mysql分层sql查询
【发布时间】:2019-03-13 18:15:50
【问题描述】:

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

在这个 sqlfiddle 示例中,我没有得到节点 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))

【问题讨论】:

  • 你能提供你预期的输出吗?
  • 旁注:当涉及到分层存储时,父行总是在子行之前。意思是,parent_id 不存在就无法存在。就您而言,您是如何得到 (19, 'categor19', 2296) 的?由于设计不佳,您正面临这个问题。你仍然可以通过shown here 使用 PHP 来实现这一点。
  • 1 0 4 1 5 1 2296 4 19 2296 20 19 21 19
  • 是的@vivek_23,是的,数据就是这样,我需要在子节点之前创建父节点,但是查询没有按照我期望的顺序返回。 mysql没有办法解决这个问题吗?

标签: mysql


【解决方案1】:

尝试以下查询,我已经在您提到的 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);

【讨论】:

  • 这不起作用。它不尊重parent nodes are listed before child nodes
  • order by 实际上变得无关紧要。 See the fiddle here。它没有达到预期的效果。
  • 试试答案的编辑版本,我想这就是你想要的。
  • 没有。它不起作用。检查192296的顺序。
  • 谢谢@Abdo20293,但结果节点19在子节点(20,21)之后,而我希望得到第一个父节点然后是子节点
猜你喜欢
  • 1970-01-01
  • 2013-03-13
  • 2017-06-03
  • 2020-12-27
  • 2010-11-24
  • 1970-01-01
  • 2020-11-28
  • 1970-01-01
相关资源
最近更新 更多