MySQL Выбор иерархии с объединением - PullRequest
0 голосов
/ 08 мая 2018

У меня есть данные иерархии, такие как:

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 select, но не могу найти ничего, что могло бы помочь в моей ситуации.

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Вы хотите выбрать все записи с помощью Related = 0. Затем вы хотите выбрать до двух случайных детей. Одним из решений является получение минимального идентификатора ребенка и максимального идентификатора ребенка. Вы можете найти родителей в подзапросе.

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;

Если вы не хотите показывать один и тот же идентификатор ребенка дважды (в случае только одного ребенка, т.е. min(id) = max(id)), измените его на:

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

Эти запросы не показывают related = 0 записей без детей, но без детей они все равно не являются родителями: -)

0 голосов
/ 08 мая 2018

Попробуйте это. Я проверяю это в 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;

DB Fiddle Upadte DB Fiddle

...