dreamweb
8.06.2004, 18:17:09
Witam
mam strukture tabeli
id (auto int), parent (int), nazwa (varchar)
i w tabeli mam przykladowe dane
1, 0, text1
2, 0, text2
3, 2, text3
4, 1, text4
5, 1, text5
6, 2, text6
itd.....
itd
Teraz chcialbym uzyskac zapytanie, ktore wybierze mi z tej bazy wszystkie wg schematu:
gdzie parent = 0
i jednoczesnie
gdzie parent=id
Tzn. w wyniku chcialbym uzyskac strukture:
id1, parent1, nazwa1, id2, parent2, nazwa2
z danymi
1, 0, text1, null, null, null
2, 0, text2, null, null, null
2, 0, text2, 3, 2, text3
1, 0, text1, 4, 1, text4
1, 0, text1, 5, 1, text5
2, 0, text2, 6, 2, text6
Czy jest to mozliwe?
BzikOS
8.06.2004, 18:35:25
[sql:1:f92bb4f6d6]SELECT d.*, d2.* FROM drzewko d LEFT JOIN drzewko d2 ON (d2.id = d.parent)[/sql:1:f92bb4f6d6]
dreamweb
8.06.2004, 19:59:54
Witam
no niestety to nie to, sprawdzalem
moze cos innego?
BzikOS
8.06.2004, 20:29:16
Więc w takim razie nie rozumiem logiki w wyniku jaki ma zwracać to zapytanie.
dreamweb
10.06.2004, 14:08:09
Witam
Naprawde nikt nie wie?
Indeo
15.06.2004, 07:29:06
Masz tu trochę zachachmęcone.
To klasyczny przykład sprzężenia wewnętrznego gdzie dane z jednej tabeli w sposób hierarchiczny odwołują się do niej samej na zasadzie podwładny-kierownik.
Na pewno będzie trzeba sprzęgnąć tą tabelę ze sobą na zasadzie:
select [select_sequence] FROM tabela [INNER|LEFT|RIGHT] JOIN tabela as tabela1 on [join_sequence] WHERE [where_sequence]
Musisz zatem ostrożnie mówić o polach zwłaszcza ID i PARENT bo pełnią pne podwójną funckję i występują w tabeli postawowej i jej aliasie.
Chcemy podłączyć tabelę 'tabela' jako 'tabela1' do tabeli 'tabela' z żądaniem aby pole 'tabela1.parent' było równe 'tabela.id' a jednocześnie żądasz aby 'tabela.parent' był = 0.
I jest to prosta sprawa.
SELECT * FROM tab LEFT JOIN tab AS tab1 ON tab.id=tab1.parent WHERE tab.parent=0
Jednak zapytanie to zwraca wynik 4 wierszowy:
1 0 text1 4 1 text4
1 0 text1 5 1 text5
2 0 text2 3 2 text3
2 0 text2 6 2 text6
brakuje tu dwóch pierwszych wierszy z twojego "żądanego wyniku". I baza nie może ich zwrócić bo niby dlaczego? Z twojego wyniku wynika że wierszom o id=1 i id=2 raz można przypisać "potomka" a raz nie. A tymczasem kazdy z tych dwu rekordów ma przypisanych dwóch potomków i nie można im podopisywac jeszcze NULL'ów.