drzewka sql metoda 5 faq
Acid - 03-02-2006 09:53
drzewka sql metoda 5 faq
Witam po raz kolejny poryszam temacik bo siedze nad tym i siedze i nie moge dojsc do rozwiazania musze napisac funkcje ktora zmienia rodzica w drzewie, po prostu np cale drzewo uzytkownika 3 (wlacznie z nim) przenosi pod usera numer 8
napisalem taka funkcje: CREATE OR REPLACE FUNCTION cheange_parent(int8, int8) RETURNS text AS $BODY$declare temprec record; person ALIAS FOR $1; new_parent ALIAS FOR $2; BEGIN CREATE TEMPORARY TABLE olds( parent_id int8, child_id int8, depth int8 ); INSERT INTO olds SELECT * FROM temida_connections WHERE parent_id IN(SELECT child_id FROM temida_connections WHERE parent_id =person ORDER BY depth) AND depth = 1; DELETE FROM temida_connections WHERE parent_id = person OR child_id = person; DELETE FROM temida_connections WHERE parent_id IN (SELECT child_id FROM olds) OR child_id IN (SELECT child_id FROM olds); INSERT INTO temida_connections VALUES(person, person, 0); INSERT INTO temida_connections VALUES(new_parent, person, 1); INSERT INTO temida_connections SELECT parent_id, person, depth + 1 FROM temida_connections WHERE child_id = new_parent AND depth > 0; FOR temprec IN SELECT * FROM olds LOOP INSERT INTO temida_connections VALUES(temprec.child_id,temprec.child_id,0); INSERT INTO temida_connections VALUES(temprec.parent_id, temprec.child_id, 1); INSERT INTO temida_connections SELECT parent_id, temprec.child_id, depth + 1 FROM temida_connections WHERE child_id = temprec.parent_id AND depth > 0; END LOOP; RETURN NULL; END; $BODY$ LANGUAGE 'plpgsql' VOLATILE; dziala tylko na malej licznie danych, przy wiekszej ilosc sie gubi, po walce dluzszej z tym doszedlem do wniosku ze powodem bledu jest ten fragment CREATE TEMPORARY TABLE olds( parent_id int8, child_id int8, depth int8 );
INSERT INTO olds SELECT * FROM temida_connections WHERE parent_id IN(SELECT child_id FROM temida_connections WHERE parent_id =person ORDER BY depth) AND depth = 1; tzn Tym select + insert wybieram dane posortowane w kolejnosci jakiej powinny byc pozniej dodawane do bazy lecz w tym miejscu FOR temprec IN SELECT * FROM olds LOOP dane wybreane juz sa raczej z losowym posortowaniem, a nie ma tutaj ich czym posortowac no i pozniej sa problemy bo f-cja probuje dodac dzieci do nie zapisanych jeszcze rodzicow.... z gory dziekuje za pomoc, moje wszelkie pomysly zostaly juz wyczerpane a siedze nad tym juz kilka dobrych dni.
baklarz - 22-02-2006 21:48
Dnia 30.01.2006 Acid <skas@gdzies.pl> napisał/a: > Witam > po raz kolejny poryszam temacik bo siedze nad tym i siedze i nie moge dojsc > do rozwiazania > musze napisac funkcje ktora zmienia rodzica w drzewie, po prostu np cale > drzewo uzytkownika 3 (wlacznie z nim) przenosi pod usera numer 8
up,down,depth 1 , 1 ,0 27 ,27 ,0 1 ,27 ,1 28 ,28 ,0 1 ,28 ,1 122,122 ,0 27 ,122 ,1 1 ,122 ,2 123,123 ,0 27 ,123 ,1 1 ,123 ,2 170,170 ,0 28 ,170 ,1 1 ,179 ,2
Przenosimy 28 do 27
Zapamiętujemy gdzieś id do skasowania. Wybieramy takim zapytaniem.
SELECT c2c_up.id FROM c2c_depth c2c_c INNER JOIN c2c_depth c2c_up ON c2c_c.up=c2c_up.up WHERE c2c_c.down=28 AND c2c_c.depth>0 AND c2c_up.down IN ( SELECT down FROM c2c_depth WHERE up=28 AND depth>0)
Wstawiamy tam gdzie trzeba INSERT INTO c2c_depth ... SELECT c2c.up ,c2c_c.down ,c2c.depth+c2c_c.depth+1 FROM c2c_depth c2c ,c2c_depth c2c_c WHERE c2c.down=27 AND c2c_c.up=28;
Kasujemy zapamiętane id ( pierwsze zapytanie).
Koniec.
-- Tomasz Drobiszewski
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
jak to =?ISO-8859-2?Q?zrobi=E6=2E=2E=2E=3F_TSQL_sql_server?==?ISO-8859-2?Q?_?=
Jak =?windows-1250?Q?pobra=E6_szacowan=B9_wielko=9C=E6_zbiory_wy nikowego_w_MS?==?windows-1250?Q?_SQL_2005=3F?=
=?iso-8859-2?Q?=5BMS_SQL=5D_Czy_mo=BFna_wywo=B3a=E6_funkcje_t ylko_raz_dla?==?iso-8859-2?Q?_ca=B3ego_zbioru_=BCr=F3d=B3owego=3F?=
[MSSQL] =?ISO-8859-2?Q?zgodno=B6ci_z_licencjami_Microsoft_?==?ISO-8859-2?Q?SQL_Server?=
=?ISO-8859-2?Q?k=B3opot_z_uruchomieniem_MY_SQL_dla_C?==?ISO-8859-2?Q?MS_i_CRM_na_Fedora_Core_3?=
Oracle PL/SQL Wstawianie =?ISO-8859-2?Q?wynik=F3w_kolekcji_d?==?ISO-8859-2?Q?o_tabeli?=
[MSSQL] ACCESS - SQL =?ISO-8859-2?Q?B=B3ad_w_konwersji_lic?==?ISO-8859-2?Q?zb?=
=?iso-8859-2?Q?=5Bmssql=5D_Zapytania_rekurencyjne__-_czy_sk=B3adnia_sql?==?iso-8859-2?Q?_co=B6_takiego_przewiduje_=3F?=
[Oracle PL/SQL] Cursor i zapis =?ISO-8859-2?Q?rekord=F3w_do_?==?ISO-8859-2?Q?kolejnych_plik=F3w?=
=?iso-8859-2?Q?=5BMySQL=5D_Co_minimalnie_potrzebne_zeby_mie=E 6_klienta_My?==?iso-8859-2?Q?SQL_na_Linuxie=3F?=
zanotowane.pldoc.pisz.plpdf.pisz.plred-hacjenda.opx.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|