Pobieranie danych hierarchicznych z tabel samoobsługowych

Załóżmy, że masz następującą tabelę:

items(item_id, item_parent)  

... i jest to tabela samo-odwołująca się - item_parent odnosi się do item_id.

Jakiego zapytania SQL użyłbyś, aby wybrać wszystkie elementy w tabeli wraz z ich głębią, gdzie głębokość elementu jest sumą wszystkich rodziców i dziadków tego elementu.

Jeżeli zawartość tabeli jest następująca:

item_id     item_parent
----------- -----------
1           0          
2           0            
3           2          
4           2          
5           3          

... zapytanie powinno pobrać następujący zestaw obiektów:

{"item_id": 1,"depth": 0}
{"item_id": 2,"depth": 0}
{"item_id": 3,"depth": 1}
{"item_id": 4, "depth": 1}
{"item_id": 5,"depth": 2}

P. S. Szukam podejścia obsługiwanego przez MySQL.

Author: Bulat, 2010-02-04

5 answers

Jeżeli bazą danych jest SQL 2005 / 2008 to...

Najprostszym sposobem uzyskania tego jest użycie CTE (Common Table Expression), które jest przeznaczone do rekurencji.

 WITH myCTE (Item_id, Depth)
 AS
 (
    Select Item_ID, 0 as Depth From yourTable where Item_Parent=0
    Union ALL
    Select yourTable.Item_ID, Depth + 1 
    From yourTable 
    inner join myCte on yourTable.item_Parent = myCte.Item_Id
 )

 Select Item_id, Depth from myCTE

Wyjście jest następujące:

Item_Id  Depth
    1   0
    2   0
    3   1
    4   1
    5   2

Z tego możesz sformatować go, jak chcesz.

 21
Author: Andrew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-04 13:47:55

Na stronie mysql jest dobry artykuł o danych hierarchicznych w MySql: Zarządzanie danymi hierarchicznymi w MySQL - znajdziesz tam kilka szczegółowych rozwiązań z plusem i minusem.

Szczególnie część o "zagnieżdżonym modelu zestawu" i "znajdowaniu głębokości węzłów" powinna Cię zainteresować.

 4
Author: FrankS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-04 14:08:24

Oracle ma bardzo wygodną składnię do pobierania danych hierarchicznych, takich jak:

select
    item_id,
    item_parent,
    level as depth
from
    items
connect by
    prior item_id = item_parent
start with
    item_parent not in (select item_id from items)

Zaczyna się od węzłów korzeniowych twoich drzew jako tych elementów, których item_parent nie istnieje w tabeli jako item_id, i wybiera wszystkie dzieci tych węzłów, wraz z ich głębią w drzewie.

 3
Author: Aaron,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-04 13:59:31
 2
Author: Andrew Sledge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-04 14:11:08

Muszę znaleźć rozwiązanie dla tego samego zadania, znalazłem kilka artykułów, ale nadal nie wybrałem, w którą stronę iść...

Http://explainextended.com/2009/07/20/hierarchical-data-in-mysql-parents-and-children-in-one-query/

Być może te linki mogą Ci pomóc. Jeśli znajdziesz dobre rozwiązanie-zamieść je tutaj. nie mogę dodawać więcej niż 1 linka - dodam kilka do następnych postów

 0
Author: user296355,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-18 10:37:17