Mam tabelę files z kolumnami: id,name,parent,depth
Jest to odwzorowanie struktury filesytemu folderu na dysku.
Czyli katalogi z plikami i podkatalogami.
Potrzebuję wyszukać (lub od razu usunąć) puste katalogi.
Na razie wymyśliłem że pobiorę do tablicy wszystkie ID katalogów
i w pętli będę sprawdzał czy dany katalog ma jakieś podkatalogi
SELECT COUNT(id) FROM files WHERE parent = ID_KATALOGU;
i usuwał gdy zwróci 0
Tylko że tych zapytań będzie bardzo dużo.
Może da się to zrobić za pomocą JOINa albo podzapytania?
> Na razie wymy�li�em �e pobior� do tablicy wszystkie ID katalog�w
> i w p�tli b�d� sprawdza� czy dany katalog ma jakie� podkatalogi
> SELECT COUNT(id) FROM files WHERE parent = ID_KATALOGU;
> i usuwa� gdy zwr�ci 0
>
> Tylko �e tych zapyta� b�dzie bardzo du�o.
> Mo�e da si� to zrobi� za pomoc� JOINa albo podzapytania?
Ale� jasne, �e da si�.
Select A.id, count(*) from
files A left outer join files B on A.id=B.parent
GROUP BY A.id
HAVING count(*)=1
--
___________ (R)
/_ _______ Adam 'Trzypion' P�aszczyca (+48 502) 122 688
___/ /_ ___ ul. Na Szaniec 23/70 31-560 Krak�w (012 378 31 98)
_______/ /_ GG: 3524356
___________/ Wywo�ywanie slajd�w http://trzypion.pl/
> Dnia Wed, 23 Dec 2009 19:56:23 +0000 (UTC), Tomek napisał(a):
>
>> Na razie wymyśliłem że pobiorę do tablicy wszystkie ID katalogów i w
>> pętli będę sprawdzał czy dany katalog ma jakieś podkatalogi SELECT
>> COUNT(id) FROM files WHERE parent = ID_KATALOGU; i usuwał gdy zwróci 0
>>
>> Tylko że tych zapytań będzie bardzo dużo. Może da się to zrobić za
>> pomocą JOINa albo podzapytania?
>
> Ależ jasne, że da się.
>
> Select A.id, count(*) from
> files A left outer join files B on A.id=B.parent GROUP BY A.id
> HAVING count(*)=1
Dzięki za podpowiedz Adam
Mam jeszcze w tabeli kolumnę dir (0/1),
zapytanie teraz wygląda tak:
SELECT j.id, count(jj.id) FROM jos_user_downloads_files j
LEFT OUTER JOIN jos_user_downloads_files jj ON j.id=jj.parent
WHERE j.dir=1
GROUP BY j.id HAVING count(jj.id)=0
Pozdrawiam i wesołych świąt