MySQL i drzewa kategorii

0

Witam. Robię drzewa na podstawie tego artykułu. Wszystko ok tylko jak mam generować dane do tabeli path:
Zaawansowane drzewa w MySQL

Jak określać relacje między podkategoriami?

0

uzyj lepiej Nested set tego z left i right, na prawde fajnei dziala i jest dosc proste do ogarniecia i juz nie potrzebujesz dodatkowej tabeli zeby wybrac sciezke od noda do root'a

0

Artykuł przeczytałem kilka razy i zrozumiałem, że opisany sposób jest bardzo prosty dzięki triggerom. Dodałem tabele i przy próbie dodania triggera wyświetla mi błąd:

#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 3

Wszystko obsługuje na localhost i oprócz zmiany nazw tabeli nic nie ruszałem. Wszystkie pola, atrybuty są identyczne.

W 3 linijce mam:

INSERT INTO k_path (parent_id, child_id, `length`) VALUES(NEW.page_id, NEW.page_id, 0);

Nie rozumiem dlaczego nie chce mi dodać.

0

Rozumiem, ze ten blad wystepuje podczas proby dodania triggera do bazy danych? MySQL probuje poinformowac, ze w zapytaniu SQL jest blad skladniowy.
Zgaduje, ze chodzi o to, ze znak srednika jest zakonczeniem instrukcji w MySQL. Zauwaz, ze w artykule, uzywany jest znak // jako symbole zakonczenia instrukcji - np.:

DELIMITER //
CREATE TRIGGER `onBeforePageInsert` BEFORE INSERT ON `page`
 FOR EACH ROW BEGIN
        IF (NEW.page_parent IS NULL OR NEW.page_parent = 0) THEN
                SET NEW.page_depth = 0;
                
                SET NEW.page_order = (SELECT IFNULL(MAX(page_order), 0) FROM page WHERE page_parent IS NULL) + 1;
                SET NEW.page_matrix = LPAD(NEW.page_order, 9, '0');
        ELSE
                SELECT page_depth, page_matrix INTO @pageDepth, @pageMatrix
                FROM page
                WHERE page_id = NEW.page_parent;
                
                SET @pageOrder = (SELECT IFNULL(MAX(page_order), 0) FROM page WHERE page_parent = NEW.page_parent) + 1;
                
                SET NEW.page_order = @pageOrder;
                SET NEW.page_depth = @pageDepth + 1;
                SET NEW.page_matrix = CONCAT_WS('/', @pageMatrix, LPAD(NEW.page_order, 9, '0'));                
        END IF;
END
//

Czy dodajac triggera uzywasz slowa kluczowego DELIMITER?

0

Nie do końca w tym leżał błąd. Jeśli na samym końcu zostawiłem // to skrypt się nie wykonywał. Dziękuje bardzo za wskazówkę.

Jedynie problem stawia mi zapytanie:

DELIMITER //
CREATE FUNCTION `GET_CHILDREN`(`pageId` INT)
        RETURNS SMALLINT(6)
        LANGUAGE SQL
        NOT DETERMINISTIC
        CONTAINS SQL
        SQL SECURITY DEFINER
        COMMENT ''
BEGIN
        RETURN (
       
                SELECT COUNT(*) -1
                FROM path
                WHERE parent_id = pageId
        );
END

Zwraca zastępujący błąd:

#1418 - This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)
0

Witam. Udało mi się z przezwyciężyć i jakoś wszystko dobrze działa :D

Kolejny mój problem z jakim się zwracam to jak odczytać drzewo do <SELECT>

Buduje takie zapytanie ale jak każdy element odczytać do nowego pola <OPTION>:

$sql = "SELECT CONCAT(REPEAT(' ', page_depth * 2), page_subject) FROM page ORDER BY page_matrix";
$wynik = mysql_query($sql);

Bardzo zależy mi na zachowaniu wcięć.

0
$sql = "SELECT CONCAT(REPEAT(' ', page_depth * 2), page_subject) AS page_subject FROM page ORDER BY page_matrix";
$query = mysql_query($sql);

echo '<select>';
while ($row = mysql_fetch_assoc($query))
{
    echo '<option>' . $row['page_subject'] . '</option>';
}
echo '</select>';

Ale to juz bylo pytanie z zakresu podstaw programowania w PHP - nie w tym watku, ale raczej w dziale Newbie.

0

Dziękuje bardzo. Pozdrawiam

0

Cześć. Myślałem że poradziłem sobie z skonfigurowaniem bazy ale zapomniałem o jednej kwestii. Nie dodałem tego kodu:

ALTER TABLE `location`
  ADD CONSTRAINT `location_ibfk_1` FOREIGN KEY (`location_page`) REFERENCES `page` (`page_id`) ON DELETE CASCADE;

ALTER TABLE `page`
  ADD CONSTRAINT `FK_page_page` FOREIGN KEY (`page_parent`) REFERENCES `page` (`page_id`) ON DELETE CASCADE ON UPDATE NO ACTION;

ALTER TABLE `path`
  ADD CONSTRAINT `path_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `page` (`page_id`) ON DELETE CASCADE,
  ADD CONSTRAINT `path_ibfk_2` FOREIGN KEY (`child_id`) REFERENCES `page` (`page_id`) ON DELETE CASCADE;

Przy próbie dodania wywala mi błąd:
#1452 - Cannot add or update a child row: a foreign key constraint fails (baza_test.#sql-a28_20b, CONSTRAINT path_ibfk_1 FOREIGN KEY (parent_id) REFERENCES kat_page (page_id) ON DELETE CASCADE)

0

Z tym sobie poradziłem. Okazało się, że dwa razy tego samego klucza nie mogę dodać ale nie byłem świadom, że już go wcześniej utworzyłem.

Teraz przy dodawaniu podkategorii do danej kategorii wywala mi błąd:

Zapytanie SQL:

INSERT INTO PAGE ( page_parent, page_subject, page_path )
VALUES ( 1, 'TV', 'TV' ) ;

MySQL zwrócił komunikat: Dokumentacja
#1048 - Column 'page_depth' cannot be null 

A wykonuje ten kod:

INSERT INTO page (page_parent, page_subject, page_path) VALUES(NULL, 'Artykuły RTV', 'Artykuły_RTV');
INSERT INTO page (page_parent, page_subject, page_path) VALUES(1, 'TV', 'TV');
INSERT INTO page (page_parent, page_subject, page_path) VALUES(2, 'LCD', 'LCD');
INSERT INTO page (page_parent, page_subject, page_path) VALUES(NULL, 'Artykuły AGD', 'Artykuły_AGD');

Nie wiem dlaczego. Linijkę z NULL przyjmuje ładnie ale już z wskazaniem rodzica tragicznie.

0

W dolnej czesci artykulu znajduje sie caly kod SQL potrzebny do utworzenia struktury tabel - wystarczy wkleic go w jakims phpmyadminie lub zaimportowac w innym programie, aby utworzyc odpowiednie tabele w bazie danych.

0

Niestety ale po skopiowaniu całego kodu wywala masę błędów. Nie mogę całevp kodu wykonać. Używam VampServer

0

Ale ja nie mowie o jakims Vamp serwer tylko oprogramowaniu ulatwiajacym zarzadzanie systemem MySQL.
Przed chwila sprawdzilem i jest ok. U siebie mam np. phpmyadmin. WKleilem caly kod SQL w zakladce "SQL" i kliknalem przycisk; po czym struktura bazy zostala po prostu zaimportowana. Wersja serwera: 5.1.52-community

EDIT: sprobowalem tez importu z linii polecen (z konsoli). Wkleilem wszystkie zapytania SQL do pliku *.sql (zalacznik) i wykonalem taka komende z konsoli:

mysql -u root -p test2 < c:\usr\test.sql

1 użytkowników online, w tym zalogowanych: 0, gości: 1