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.
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.
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ć.
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.
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
MySQL
- http://www.artfulsoftware.com/mysqlbook/sampler/mysqled1ch20.html
- http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/
EDIT: usunięto zbędne informacje
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
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