Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> trigger - problem
stal-sw
post 15.03.2012, 08:45:05
Post #1





Grupa: Zarejestrowani
Postów: 176
Pomógł: 0
Dołączył: 27.06.2002
Skąd: Stalowa Wola

Ostrzeżenie: (0%)
-----


Witam.
Mam w bazie danych 2 tabele:

OCENY:
id, user_id, obiekt_id, srednia_ocena

OBIEKTY
id, nazwa, srednia_ocena

W tabeli OCENY uzytkownicy dodaja sobie oceny obiektow - podczas dodania rekordu do tej tabeli za pomoca php robie update sredniej oceny z wszystkich dokonanych ocen dla danego obiektu (lacznei z nowym wpisem) do tabeli OBIEKTY - i robie udpate pola srednia_ocena.

Jak zrobic tak ze podczas kasowania rekordu w tabeli OCENY (czy to za pomoca php czy za pomoca phpmyadmina) od nowa wyliczyc srednia dla OBEIKTU (o kasowanym - obiekt_id) i wprowdzic wartosc do pola srednia_ocena w tabli OBIEKTY.

W taki sposob robie obliczenia podczas dodawania nowej oceny do bazy za pomoca php:
  1. $ocsrednia = $db->get_row("SELECT TRUNCATE(AVG(ocena),4) as srednia FROM oceny WHERE id_obiektu='".$id_obiektu."' ");
  2. $db->query("UPDATE OBIEKTY SET ocsrednia='".$ocsrednia->srednia."' WHERE id='".$id_obiektu."'");



Teraz chcialbym zrobic cos podobnego przy uzyciu tylko bazy danych - i zeby to odbywalo sie zawsze podczas kasowania rekordu w tabeli OCENY (tylko obliczenia maja byc dokonywane wylacznie dla kasowanego OBIEKT_ID gory dzieki za pomoc


--------------------
Go to the top of the page
+Quote Post
cojack
post 15.03.2012, 10:53:41
Post #2





Grupa: Zarejestrowani
Postów: 898
Pomógł: 80
Dołączył: 31.05.2008

Ostrzeżenie: (20%)
X----


http://dev.mysql.com/doc/refman/5.0/en/trigger-syntax.html


--------------------
cojack blog - mój blog (na jakiś czas off).
"jak czegoś nie wiem, to nie myślę że wiem" - moja domena
Go to the top of the page
+Quote Post
stal-sw
post 15.03.2012, 11:16:07
Post #3





Grupa: Zarejestrowani
Postów: 176
Pomógł: 0
Dołączył: 27.06.2002
Skąd: Stalowa Wola

Ostrzeżenie: (0%)
-----


Witam.
Na razie udalo sie sklecic cos takiego:

  1.  
  2. DROP TRIGGER IF EXISTS `trig_przelicz_ocena`;
  3. delimiter //
  4. CREATE `trig_przelicz_ocena`
  5. AFTER DELETE ON `oceny` FOR EACH ROW
  6. BEGIN
  7. ................. questionmark.gif
  8.  
  9. UPDATE `obiekty`
  10. questionmark.gifquestionmark.gifquestionmark.gifquestionmark.gifquestionmark.gif?
  11. WHERE id = obiekt_id;
  12. END//

Dalej nie mam pojecia jak zrobic moj przyklad - chocaiz przegladnalem juz troche gotowcow troggerow sad.gif


--------------------
Go to the top of the page
+Quote Post
alegorn
post 15.03.2012, 11:44:04
Post #4





Grupa: Zarejestrowani
Postów: 341
Pomógł: 40
Dołączył: 23.06.2009

Ostrzeżenie: (0%)
-----


tak, mozemy to zrobic za ciebie, ale ja za przykladem kolegi - dam ci wedke :]

zainstaluj sobie przykladowa baze danych sakila (chocby tutaj: mysql-sakila )

masz tam przyklady ciekawych rozwiazan, takze triggerow, mysle ze wiekszosc watpliwosci to pomoze rozwiazac..
j.
Go to the top of the page
+Quote Post
stal-sw
post 15.03.2012, 11:47:12
Post #5





Grupa: Zarejestrowani
Postów: 176
Pomógł: 0
Dołączył: 27.06.2002
Skąd: Stalowa Wola

Ostrzeżenie: (0%)
-----


Witam.
A moze da sie to zrobic w takim stylu ?

  1. DROP TRIGGER IF EXISTS przelicz_oceny;
  2. delimiter $$
  3. CREATE TRIGGER przelicz_oceny
  4. AFTER DELETE ON oceny
  5. FOR EACH ROW
  6. BEGIN
  7.  
  8. UPDATE obiekty SET osrednia=(SELECT TRUNCATE(AVG(ocena),4) FROM oceny WHERE id_obiektu=$id_obiektu) WHERE id=$id_obiektu
  9.  
  10. END$$
  11. delimiter ;


Ten post edytował stal-sw 15.03.2012, 11:47:37


--------------------
Go to the top of the page
+Quote Post
nospor
post 15.03.2012, 12:01:04
Post #6





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Jak ty żeś czytał o tych triggerach? Przecież dość wyrażnie jest tam wspomniane o NEW oraz OLD, które to przechowuję informacje, których szukasz...


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 9.07.2025 - 04:02