Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: TRIGGER zliczający rekordy
Forum PHP.pl > Forum > Bazy danych > MySQL
Athlan
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.
mortus
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.
Crozin
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
mortus
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).
Athlan
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
Mchl
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)
Athlan
Ś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;
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.