我有这样的层次结构数据:
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选择分层数据,但我找不到任何可以帮助我的情况。
答案 0 :(得分:0)
试试这个。我在MSSQl中测试它。我希望它也适用于mysql
SELECT id,child FROM
(SELECT t1.Related id,t1.id child,row_number() over (partition by t1.Related ORDER BY t1.Id) sl FROM Table1 t1
INNER JOIN Table1 t2 ON t1.Related=t2.Id) t
where t.sl<=2
OR
SET @row_number:=0;
SET @Related:=0;
SET @Child:=0;
SELECT t.id,t.Child FROM
(SELECT @row_number:=CASE WHEN @Related=t1.Related THEN @row_number+1 ELSE 1 END AS row_nu, @Related:=t1.Related AS id,@Child:=t1.id AS Child
FROM Table1 t1
INNER JOIN Table1 t2 ON t1.Related=t2.Id) t
WHERE t.row_nu<=2;
答案 1 :(得分:0)
您想要选择Related = 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(如果只有一个孩子,即min(id) = max(id)
),请将其更改为:
select
related as parent_id,
min(id) as child1_id,
nullif(max(id), min(id)) as child2_id
...
这些查询没有显示没有孩子的related = 0
记录,但是,如果没有孩子,他们不是父母: - )