Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> TRIGGER zliczający rekordy
Athlan
post 9.05.2010, 13:48:45
Post #1





Grupa: Developerzy
Postów: 823
Pomógł: 12
Dołączył: 18.12.2005

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


Witam,

posiadam tabelę cms_news, cms_news_categories oraz cms_news_categories_handler (wiążącą newsa z kategorią). Chciałbym utworzyć trigger zmieniający wartość pola cat_meta_count w tabeli cms_news_categories na ilość aktywnych powiązań newsów z daną kategorią - w skrócie - ile jest newsów w kategorii, do której dodaje powiązanie.

Próbowałem czegoś takiego:
  1. CREATE TRIGGER news_categories_count AFTER INSERT ON cms_news_categories_handler
  2. FOR EACH ROW
  3. BEGIN
  4. UPDATE cms_news_categories SET cat_meta_count = SELECT COUNT(handler_cat, handler_item) FROM cms_news_categories_handler WHERE cat_meta_count = NEW.handler_cat;
  5. END;

Niestety, na SELECT COUNT jest syntax error. Innym rozwiązaniem jest dodanie jedynki do aktualnego stanu liczby newsów w kategorii:
  1. CREATE TRIGGER news_categories_count AFTER INSERT ON cms_news_categories_handler
  2. FOR EACH ROW
  3. BEGIN
  4. UPDATE cms_news_categories SET cat_meta_count = cat_meta_count + 1 WHERE cat_meta_count = NEW.handler_cat;
  5. END;

Tu z kolei otrzymuję komunikat:
Cytat
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 4


Delimiter nie pomaga. Przykład jest dosłownie zerżnięty (kolokwialnie ujmując) z manuala.

Z góry dzięki za pomoc,
Athlan.


--------------------
Portfolio: Vgroup.pl | athlan.pl | Test.php.pl - sprawdź się z wiedzy o PHP i ułóż własne pytania!
Pomogłem? Kliknij pod postem.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 6)
mortus
post 9.05.2010, 14:22:11
Post #2





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


Drugi trigger wygląda jak najbardziej prawidłowo. Zauważ tylko, że używasz niewłaściwych kolumn w warunku WHERE. Wydaje mi się, że w tabeli cms_news_categories_handler zapisujesz na pewno identyfikator kategorii (handler_cat), tymczasem w warunku WHERE nie porównujesz tego z kluczem głównym (identyfikatorem kategorii) z tabeli cms_news_categories, ale porównujesz z liczbą powiązanych z daną kategorią artykułów (cat_meta_count). Gołym okiem widać, że coś jest nie tak.
Go to the top of the page
+Quote Post
Crozin
post 9.05.2010, 14:33:05
Post #3





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Cytat
Niestety, na SELECT COUNT jest syntax error.
Wrzuć całego SELECTa, w nawiasy - bo teraz nie wiadomo np. czy WHERE odnosi się do wewnętrznego SELECTa, czy do UPDATEa
Go to the top of the page
+Quote Post
mortus
post 9.05.2010, 14:36:23
Post #4





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


Tyle, że w pierwszym podanym przez Ciebie triggerze również używasz niewłaściwych kolumn (przynajmniej tak mi się wydaje) w klauzuli WHERE i brakuje inkrementacji (nigdzie nie dodajesz 1).
Go to the top of the page
+Quote Post
Athlan
post 9.05.2010, 19:26:07
Post #5





Grupa: Developerzy
Postów: 823
Pomógł: 12
Dołączył: 18.12.2005

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


Cześć,

po małych modyfikacjach zapytania:
  1. DELIMITER \\
  2. CREATE TRIGGER news_categories_count AFTER INSERT ON cms_news_categories_handler
  3. FOR EACH ROW
  4. BEGIN
  5. UPDATE cms_news_categories SET cat_meta_count = (SELECT COUNT(handler_cat, handler_item) FROM cms_news_categories_handler WHERE cat_id = NEW.handler_cat);
  6. END; \\

Wyrzuca mi tym razem (niezrozumiale) błąd:
Cytat
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' handler_item) FROM cms_news_categories_handler WHERE cat_id = NEW.handler_cat);' at line 4

O ile pamiętam, nikt nigdy nie zabraniał countu po dwóch unikatowych polach winksmiley.jpg


--------------------
Portfolio: Vgroup.pl | athlan.pl | Test.php.pl - sprawdź się z wiedzy o PHP i ułóż własne pytania!
Pomogłem? Kliknij pod postem.
Go to the top of the page
+Quote Post
Mchl
post 10.05.2010, 08:48:11
Post #6





Grupa: Zarejestrowani
Postów: 855
Pomógł: 145
Dołączył: 17.07.2008
Skąd: High Memory Area

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


No to coś źle pamiętasz.
http://dev.mysql.com/doc/refman/5.1/en/gro...#function_count

Możesz spróbować COUNT(DISTINCT kol1,kol2)
Go to the top of the page
+Quote Post
Athlan
post 10.05.2010, 08:56:52
Post #7





Grupa: Developerzy
Postów: 823
Pomógł: 12
Dołączył: 18.12.2005

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


Świetnie, działa. Dla przyszłych pokoleń: nie zapomnijcie zmienić delimiter w phpMyAdmin pod okienkiem wykonywania zapytania na inny niż ";"

Finalne zapytanie:
  1. CREATE TRIGGER news_categories_count AFTER INSERT ON cms_news_categories_handler
  2. FOR EACH ROW
  3. BEGIN
  4. UPDATE cms_news_categories SET cat_meta_count = (SELECT COUNT(DISTINCT handler_cat, handler_item) FROM cms_news_categories_handler WHERE cat_id = NEW.handler_cat);
  5. END;


--------------------
Portfolio: Vgroup.pl | athlan.pl | Test.php.pl - sprawdź się z wiedzy o PHP i ułóż własne pytania!
Pomogłem? Kliknij pod postem.
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: 26.06.2025 - 20:24