MySQL - určení hierarchie potomka

MySQL - určení hierarchie potomka
« kdy: 06. 06. 2019, 13:13:21 »
V prikladove tabulce bych potreboval urcit "top rodice" "potomka"

Kód: [Vybrat]
+----+-----------+----------+
| id | parent_id | child_id |
+----+-----------+----------+
|  1 |         4 |        5 |
|  2 |         4 |        3 |
|  3 |         3 |        1 |
+----+-----------+----------+

tzn: child_id 1 -> 3 -> 4 [top_rodic]

Vubec me nenapada jake query pouzit s ohledem na vykon. Poradi by nekdo?
« Poslední změna: 06. 06. 2019, 13:41:34 od Petr Krčmář »


hechj

Re:MYSQL - urceni hierarchie potomka
« Odpověď #1 kdy: 06. 06. 2019, 13:38:07 »
Je to id, které nemá rodiče

Re:MySQL - určení hierarchie potomka
« Odpověď #2 kdy: 06. 06. 2019, 13:47:54 »
S ohledem na výkon je nejlepší použít hierarchii intervalů: https://en.wikipedia.org/wiki/Interval_tree

Každý uzel je určen intervalem [left, right].
Každý potomek pak má left potomka > left předka, a right potomka < right předka.

Potomky a předky pak poměrně rychle selectujete pomocí order by.

Pro předky prvku:
SELECT * FROM tree WHERE left < left_potomka ORDER BY left ASC;

Pro potomky:
SELECT * FROM tree WHERE left BETWEEN left_predka AND right_predka ORDER BY left ASC;

Re:MySQL - určení hierarchie potomka
« Odpověď #3 kdy: 06. 06. 2019, 14:20:39 »
https://explainextended.com/2009/03/17/hierarchical-queries-in-mysql/

Ale je to celkem starsi clanek.

Googli "connect by prior in mysql"

Re:MySQL - určení hierarchie potomka
« Odpověď #4 kdy: 06. 06. 2019, 14:22:56 »
Tady je varianta pro MySQL 8

https://stackoverflow.com/questions/20215744/how-to-create-a-mysql-hierarchical-recursive-query

Jinak zvazil bych prechod na Postgres.


Re:MySQL - určení hierarchie potomka
« Odpověď #5 kdy: 06. 06. 2019, 18:16:53 »
Njn, v postgresql to mas na jeden dotaz http://sqlfiddle.com/#!17/4f415/1/0