Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Usuwanie rekordów nie posiadających dzieci/podkatalogów

1 view
Skip to first unread message

Tomek

unread,
Dec 23, 2009, 2:56:23 PM12/23/09
to
Witam

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?

Adam Płaszczyca

unread,
Dec 23, 2009, 4:04:19 PM12/23/09
to
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

--
___________ (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/

Tomek

unread,
Dec 24, 2009, 8:54:57 AM12/24/09
to
On Wed, 23 Dec 2009 22:04:19 +0100, Adam Płaszczyca wrote:

> 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

0 new messages