konto usunięte

Temat: [mysql] Aktualizacja wpisów

Hej, to pewnie błacha sprawa.

Mam proste drzewo kategorii, dwa poziomy: kategoria parent -> kategoria children -> strona. Każda kategoria children ma ileś tam stron w relacji m:n.

Piszę procedurę, która ma podsumować ile jest stron przypisanych do kategorii children a następnie do kategorii parent.

Planowałem zrobić to tak, że robie sobie widok:

CREATE VIEW msp_test.countSites AS SELECT sc.fk_categories_id, count(*) count FROM sites_categories sc inner JOIN sites s on sc.fk_sites_id = s.id group by sc.fk_categories_id;

wynik tego widoku zrzucam do zmiennej, następnie w procedurze jadę kursorem po odpowiednich dzieciach, ze zmiennej odczytuje ile dla danego id jest stron i robie update dla kategorii.

Następnie dla parentów chce przelecieć po children sumując i również update.

jak w procedurze zdefiniować typ i potem wykonać selecta, który zwracając mi ileśtam wierszy wrzuci wynik do zmiennej?

Chce uniknąć odpytań w pętlach oraz dużej ilości joinów.

Może jest jakaś lepsza metoda?
Dawid Rokita

Dawid Rokita CTO picAds.pl

Temat: [mysql] Aktualizacja wpisów

Ja bym to zrobił tak:

Zrób trigger na sites ON INSERT,DELETE, który zrobi select count + update dla OLD.id_kategorii i NEW.id_kategorii

Zrób trigger na sites_categories ON UPDATE który zrobi count na sites_categories dla OLD.id i NEW.id - ten trigger zadziała tuż po pierwszym

Nie podpowiem kodu bo nie wiem jakiej bazy używasz :-) ale może zamysł będzie jasny :-)

Co do wrzucania selecta do zmiennej to może ten kod coś Ci podpowie (wystarczy typy zmienić) (kod w PlPgSql):

CREATE OR REPLACE FUNCTION liczenie_obrazow_dla_parent()
RETURNS trigger AS
$BODY$DECLARE
im_count integer := 0;
own_im_count integer := 0;
curs_cnt_images CURSOR (cat integer) IS SELECT SUM(images_count) FROM images_categories WHERE parent_id=cat;
curs_count1_images CURSOR (cat integer) IS SELECT COUNT(*) FROM images WHERE visible=true AND images_categories_id=cat;
BEGIN

IF NEW.parent_id IS NOT NULL THEN
OPEN curs_cnt_images(NEW.parent_id);
FETCH curs_cnt_images INTO im_count;
CLOSE curs_cnt_images;
OPEN curs_count1_images(NEW.parent_id);
FETCH curs_count1_images INTO own_im_count;
CLOSE curs_count1_images;
UPDATE images_categories SET images_count=im_count+own_im_count WHERE "id"=NEW.parent_id;
END IF;





RETURN NEW;
END;$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION liczenie_obrazow_dla_parent() OWNER TO ktostam;

Następna dyskusja:

select mysql




Wyślij zaproszenie do