Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.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 用union选择层次结构_Mysql_Sql_Hierarchy - Fatal编程技术网

Mysql 用union选择层次结构

Mysql 用union选择层次结构,mysql,sql,hierarchy,Mysql,Sql,Hierarchy,我有如下层次结构数据: Id, Related 1, 0 2, 1 3, 1 4, 1 5, 4 6, 3 7, 0 8, 7 9, 3 10, 8 我想选择2个家长,然后为每个家长找到2个孩子 结果: id 1 2 3 7 8 比如: select * from TABLE T1 where T1.related=0 order by T2.id limit 2 union select * from TABLE T2 where T1.id=T2.related orde

我有如下层次结构数据:

Id, Related
1, 0
2, 1
3, 1
4, 1
5, 4
6, 3
7, 0
8, 7
9, 3
10, 8
我想选择2个家长,然后为每个家长找到2个孩子

结果:

id
1
  2
  3
7
  8
比如:

select * from TABLE T1 where T1.related=0 order by T2.id limit 2 
union 
select * from TABLE T2 where T1.id=T2.related order by T2.id limit 2
我一直在研究mysql选择分层数据,但我找不到任何有助于我的情况

试试这个。我在MSSQl中测试它。我希望它在mysql中也能工作


您想选择所有相关=0的记录。然后,您最多要选择两个随机子项。一种解决方案是采用最小子ID和最大子ID。您可以在子查询中查找父项

select
  related as parent_id, 
  min(id) as child1_id,
  max(id) as child2_id
from mytable
where related in (select id from mytable where related = 0)
group by related;
如果您不想在只有一个子项的情况下两次显示同一个子项ID,即minid=maxid,请将此更改为:

select
  related as parent_id, 
  min(id) as child1_id,
  nullif(max(id), min(id)) as child2_id
...

这些查询不会显示没有子项的related=0记录,但是,如果没有子项,它们就不是父项:-

我不相信这在MySQL<8.0中仍然是测试版,因为窗口函数还不存在。这很有趣,但我希望保持灵活性。我希望第1行是一个父行,第2行和第3行是它的子行(如果存在),下一行是另一个父行(如果存在),另外两个子行。但我希望将来能够将其更改为更多的子项。这通常通过递归查询来解决。从MySQL 8.0开始提供。对于较低版本的MySQL,我不会在SQL中这样做,而是在应用程序或网站上用编程语言这样做。因为您只对树的前两级感兴趣,所以不需要递归查询就可以这样做。可能是MySQL变量。
select
  related as parent_id, 
  min(id) as child1_id,
  max(id) as child2_id
from mytable
where related in (select id from mytable where related = 0)
group by related;
select
  related as parent_id, 
  min(id) as child1_id,
  nullif(max(id), min(id)) as child2_id
...