Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Kategorie Depesza
Forum PHP.pl > Forum > Bazy danych > MySQL
z3L
Witam.

Zaimplementowałem u siebie ten sposób drzewa kategorii:

http://www.depesz.com/various/various-sqlt...lementation.php

Popularnie - `Kategorie Depesza`. Depesz dodaje tam procedury w postresql, np:
  1. CREATE OR REPLACE FUNCTION getitemlevel(integer) RETURNS integer AS '
  2. DECLARE
  3. in_item_id ALIAS FOR $1;
  4. reply INTEGER;
  5. BEGIN SELECT depth INTO reply FROM powiazania WHERE child_id = in_item_id ORDER BY depth desc LIMIT 1 ;
  6. RETURN reply;
  7. END;
  8. ' LANGUAGE 'plpgsql';


Istnieje sposób przerobienia tej procedury na mysql ?

Pozdrawiam.
phpion
Przecież ta funkcja jest najprostszą z możliwych. Pobiera wartość SELECTem, zapisuje do zmiennej i zwraca. Koniec filozofii. Nie powinieneś mieć problemów z przeniesiem tej funkcji do MySQL. Próbuj i w razie problemów pisz.
z3L
Cytat(phpion @ 11.03.2009, 15:40:17 ) *
Przecież ta funkcja jest najprostszą z możliwych. Pobiera wartość SELECTem, zapisuje do zmiennej i zwraca. Koniec filozofii. Nie powinieneś mieć problemów z przeniesiem tej funkcji do MySQL. Próbuj i w razie problemów pisz.


Udało mi się zrobić coś takiego, ale nadal to nie jest to.
  1. CREATE FUNCTION getitemlevel(integer) RETURNS integer
  2. DECLARE
  3. in_item_id ALIAS FOR $1;
  4. reply INTEGER;
  5. BEGIN SELECT depth INTO reply FROM connections WHERE second_id = in_item_id ORDER BY depth DESC LIMIT 1 ;
  6. RETURN reply;
  7. END;


Występują błędy przy ALIAS FOR, nie wiem czym to zastąpić.

A chciałbym jeszcze później przerobić tą funkcję:

  1. CREATE OR REPLACE FUNCTION createTreePath(integer) RETURNS TEXT AS '
  2. declare
  3. in_leaf_id ALIAS FOR $1;
  4. temprec RECORD;
  5. reply TEXT;
  6. BEGIN reply := ''/'';
  7. FOR temprec IN SELECT k.ordering FROM kategorie k join powiazania p on k.id = p.parent_id WHERE p.child_id = in_leaf_id ORDER BY p.depth desc LOOP
  8. reply := reply || to_char(temprec.ordering,''000000'') || ''/'';
  9. END LOOP;
  10. RETURN reply;
  11. END;
  12. ' LANGUAGE 'plpgsql';
phpion
Alias, jak to alias, jest zbędny. Wystarczy, że podpatrzysz przykłady tworzenia procedur/funkcji w MySQL:
http://dev.mysql.com/doc/refman/5.0/en/create-procedure.html
i odpowiednio zmodyfikujesz tą z PostgreSQL. Nikt za Ciebie tego nie będzie robił.
z3L
Nie chciałem tworzyć nowego tematu, więc zadam pytanie w tym.

Dodałem sobie triggera do bazy:

  1. delimiter |
  2.  
  3. CREATE TRIGGER `categories_insert` AFTER INSERT ON `categories`
  4. FOR EACH ROW BEGIN INSERT INTO connections (first_id, second_id, depth) VALUES (NEW.id, NEW.id, 0);
  5.  
  6. IF connections.second_id IS NOT NULL THEN
  7. INSERT INTO connections (first_id, second_id, depth)
  8. SELECT NEW.id, second_id, depth + 1 FROM connections WHERE first_id = connections.second_id;
  9. END IF;
  10.  
  11. END;
  12. |


Wszystko pięknie, lecz gdy robie inserta w categories, to wyrzuca mi error : `Unknown table connections in the field list`. A tabela connections istnieje.

P.S.

Trigger powinien ogólnie wyglądać tak:

  1. delimiter |
  2.  
  3. CREATE TRIGGER `categories_insert` AFTER INSERT ON `categories`
  4. FOR EACH ROW BEGIN INSERT INTO connections (first_id, second_id, depth) VALUES (NEW.id, NEW.id, 0);
  5.  
  6. IF NEW.second_id IS NOT NULL THEN
  7. INSERT INTO connections (first_id, second_id, depth)
  8. SELECT NEW.id, second_id, depth + 1 FROM connections WHERE first_id = NEW.second_id;
  9. END IF;
  10.  
  11. END;
  12. |


Lecz wtedy podczas dodawania triggera wyrzuca błąd, że second_id nie istnieje.

O co chodzi ?
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.