2010-02-04 8 views
20

Powiedzmy masz następującą tabelę:Getting hierarchii dane z własnym przedstawieniu tabelach

items(item_id, item_parent) 

... i to jest samodzielnym przedstawieniu stół - item_parent dotyczy item_id.

Jakie zapytanie SQL użyjesz do WYBIERZENIA wszystkich elementów w tabeli wraz z ich głębokością, gdzie głębokość elementu jest sumą wszystkich rodziców i dziadków tego przedmiotu.

Jeśli Poniżej znajduje się treść tabeli:

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

... zapytanie należy pobrać następujący zestaw obiektów:

{ "item_id": 1, "głębokość": 0 }
{ "item_id" 2 "głębokości": 0}
{ "item_id": 3, "głębokość" 1}
{ "item_id": 4, "głębokość" 1}
{” item_id ": 5," depth ": 2}

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

+2

Wyszukaj "Rekurencyjny CTE". – RBarryYoung

+2

Jaka baza danych i wersja? Zapytania rekursywne są specyficzne dla dostawcy, jeśli w ogóle są obsługiwane. – RedFilter

+2

@RBarryYoung: Zakłada się, że używa on MS SQL Server. –

Odpowiedz

21

Jeśli baza danych jest SQL 2005/2008 następnie ...

Najprostszym sposobem, aby dostać się to za pomocą CTE (Common Expression tabeli), której celem jest przeszukanie.

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 w następujący sposób:

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

od tego można sformatować go jak chcesz.

+0

Dzięki za sugestię! Chciałbym zobaczyć podejście obsługiwane przez MySQL. –

+0

Emanuil: Twoim obowiązkiem jest informowanie ludzi o wymaganiach związanych z implementacją (takich jak MySQL) * przed * oni próbują odpowiedzieć na twoje pytanie. – RBarryYoung

3

Oracle ma bardzo wygodny składnię dla pobierania danych hierarchicznych tak:

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) 

Rozpoczyna się od węzłów głównych drzew jako elementów, których element_przedmiotowy nie istnieje w tabeli jako id_produktu, i wybiera wszystkie elementy podrzędne tych węzłów wraz z ich głębokością w drzewie.

+0

Nie wiedziałem, że Oracle to ma. To jest dobre wiedzieć. Czy nie byłoby wydajniej, gdyby rodzice mieli wartość pustą w kolumnie item_parent, abyśmy mogli uniknąć "nie w" i dodatkowego wyboru – jett

4

Istnieje dobry artykuł techniczny na stronie mysql o danych hierarchicznych w MySql: Managing Hierarchical Data in MySQL - można znaleźć kilka szczegółowych rozwiązań z pro i przeciw tam.

Szczególnie interesująca może być część dotycząca "Zagnieżdżonego modelu zestawu" i "Znajdowania głębokości węzłów".

0

Potrzebuję znaleźć rozwiązanie dla tego samego zadania, znalazłem kilka artykułów, ale wciąż nie zdecydowałem, którą drogą iść ...

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

Może te linki mogą pomóc. Jeśli znajdziesz dobre rozwiązanie - opublikuj go tutaj. nie wolno mi publikować więcej niż 1 linku - dodam kilka do następnych postów

+0

http://www.evolt.org/article/Four_ways_to_work_with_hierarchical_data/17/4047/ index.html – user296355

+0

http://blog.jupo.org/post/353496075/linear-traversal-of-adjacency-list-trees – user296355

+0

http://www.alandelevie.com/2008/07/12/recursion-less- przechowywanie-hierarchicznych-danych-w-relacyjnej-bazie danych / – user296355

Powiązane problemy