bunun için epey önce (sanırım 3 yıl fln) pl/sql (postgresql) de bir
fonksiyonu recursive çalıştırarak bir çözüm bulmuştum.
daha sonra yine benzeri bir şeye mysql de ihtiyacım olunca recursive
çözümümün yavaş kaldığını hissettim. burada suçu mysql e atıyorum. bu yüzden
tabloya key adında bir field ekledim ve get/set/search için gömülü
fonksiyonlar yazdım. key filed ında '12:23:33' gibi bir string tutuyordu. bu
string şu demek; root id = 12, onun altında 23 onunda altında 33 var ve key
field ında bu değer yazanın da parent i 33 id ye sahip kayıt.

select * from where key like '12:23:%';

gibi bir sorgu yaparak 12 nin altında ki 33 ün altında bağlı olan tüm
kayıtları getiriyor. bu sayede herhangi bir recursive fonksiyona ihtiyaç
kalmıyor. ~2 milyon satırlı tabloda mysql ile oldukça iyi sonuçlar aldım bu
şekilde. ama sonuçta bunu bir ağaç yapısı gibi düşünürsen bir kaydı alıp
başka bir kaydın altına taşımak için mesela parent id yi değiştirmek
yetmiyor. key kolonunuda güncellemen gerekiyor. bu işlem için parent id
değişince key i güncelleyen bir trigger yazmıştım. bana biraz kulağı tersten
tutmak gibi geldi ama performans konusunda epey iyi olduğunu söyleyebilirim
genel olarak bu yöntemin.

bu çok genel bir sorun. pek de araştırmadım ama çok daha efektif çözümleri
birileri bulmuştur sanırım.

yeterince net anlatamadığımın farkındayım ancak fazlaca zamanım yok.

kolay gelsin..

14 Nisan 2010 15:08 tarihinde Timuçin Kızılay <[email protected]>yazdı:

> Verdiğiniz örnekteki gibi denedim, sadece bir alt seviyede bağlı olan
> kayıtları topluyor, benim istediğim tüm alt dallardakileri toplaması.
>
>
>
> Uygar UZUNHASAN yazmış:
> > Tabloya "A" diyorum, istediğiniz sanırım şu:
> >
> > SELECT id, parent_id, kod, ad, sayi, toplam_sayi
> > FROM
> >       (Select parent_id as pid, sum(sayi)as toplam_sayi FROM A GROUP BY
> > parent_id) AS B, A
> > WHERE B.pid=A.parent_id
> >
> > Uygar UZUNHASAN
> > http://www.nobelyazilim.com/
> >
> >
> >
> > ------------------------------------------------------------------------
> > *From:* Timuçin Kızılay <[email protected]>
> > *To:* Özgür yazılımlarla çeşitli dillerde yazılım geliştirme
> > <[email protected]>
> > *Sent:* Wed, April 14, 2010 1:56:09 PM
> > *Subject:* [Linux-programlama] SQL sorgusu.
> >
> > Elimde şuna benzer, ağaç yapısında bir tablo var:
> >
> > id int,
> > parent_id int,
> > kod varchar(20),
> > ad varchar(50),
> > sayi float
> >
> >
> > bu tablodaki kayıtlar id ve parent_id alanlarından birbirine bağlı
> > olarak ağaç yapısında.
> > Şimdi benim bu tablodan almaya çalıştığım bilgi, herhangi bir kaydın tüm
> > bağlı kayıtlarındaki sayi alanının toplamı.
> >
> > kod, ad, sayi, alt_toplam_sayı, toplam_sayi şeklinde satırları olan bir
> > sorgu yapamaya çalışıyorum ama tek bir sorgu ile bunu almayı
> > başaramadım. istemci tarafında recursive bir fonksiyon ile alabiliyorum
> > ama kayıt sayısı arttığında bu recursive fonksiyon içinden tekrar tekrar
> > sorgulamak çok yavaşlayacak diye düşünüyorum. Bunun kolay bir yolu var
> > mıdır?
> >
> > Dil olarak python ve sqlalchemy kütüphanesi kullanıyorum ama burada
> > merak ettiğim olay algoritma ile ilgili bu yüzden herhangi bir dille ya
> > da sql sorgusu olarak yanıt verirseniz de bir şekilde python'a çeviririm.
>
> _______________________________________________
> Linux-programlama mailing list
> [email protected]
> https://liste.linux.org.tr/mailman/listinfo/linux-programlama
> Liste kurallari: http://liste.linux.org.tr/kurallar.php
>
_______________________________________________
Linux-programlama mailing list
[email protected]
https://liste.linux.org.tr/mailman/listinfo/linux-programlama
Liste kurallari: http://liste.linux.org.tr/kurallar.php

Cevap