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
