Pomoc przy zadaniu SQL

0

Mam zadania do wykonania. 1 i 2 ok, ale 3 i 4 nie rozumiem.Dzięki z góry za wskazówkę

  1. Napisz skrypt SQL ktory utworzy tabele "menu" o polach:

    id - typu integer, klucz podstawowy
    parent_id - integer
    name - varchar

  2. Dla kolumny parent_id utworz klucz obcy odwolujacy sie do kolumny id.

  3. Wykorzystujac tabele "menu" , utworz zapytanie ktore wstawi do tabeli ponizsza strukture danych:
    -main
    --category1
    ---item1
    ---item2
    --category2
    ---item1
    ---item2

,gdzie liczba znakow "-" oznacza poziom zaglebienia

  1. Napisz skrypt PHP ktory pobierze dane z tabeli "menu" REKURENCYJNIE.
0

To parent_id jest właśnie poziomem zagłębienia czyli dla main wartość 0, dla category1 wartość 1.

0

Dla elementu bez rodzica parent_id będzie raczej NULL niż 0, szczególnie jeżeli definiujemy klucz obcy.

1

odp.1

CREATE TABLE menu ( id int PRIMARY KEY, parent_id int, name varchar(255))

odp.2

ALTER TABLE menu ADD CONSTRAINT parent_id_fk FOREIGN KEY (parent_id) REFERENCES menu(id)

odp.3
trzecie pytanie jest bez sensu, gdzie masz wstawić te dane jak masz tylko 3 kolumny id, parent_id, name ? z tego co napisałeś mi wynika że trzeba by było tabele jeszcze jedną napisać żeby można było poniższą strukturę danych uzyskać i zrobić między nimi relacje ale o tym nic nie ma w pytaniu. Albo po prostu nie wiem o co kaman ;D

odp.4
pewnie będzie wyglądała jakoś tak:

;WITH Emp_CTE AS 
(
    SELECT id, parent_id, name, main, category1, category2
    FROM #menu
    WHERE parent_id IS NULL
    UNION ALL
    SELECT e.id, e.parent_id, e.name, e.main, e.category1, e.category2
    FROM #manu e
    INNER JOIN Emp_CTE ecte ON ecte.id = e.parent_id
)
SELECT * FROM Emp_CTE
DROP TABLE #menu

Wyrażenie :WITH robi następującą rzecz. Na początku wykonuje się SELECT który wybiera rekord o najwyższym szczeblu.
Na tym etapie zmienna CTE Emp_CTE ma jeden rekord.
Później są wykonywane następne SELECT-y które dodają następne rekordy do Emp_CTE tylko jeżeli wystąpiło JOIN-owanie pomiędzy wyższym rekordem a niższym
W ten sposób w kroku drugim CTE Emp_CTE ma 3 rekordy.
Postępując dalej w taki sam sposób będziemy mieli listę zgodną z poziomem w hierarchii.
Na końcu zapytania tabela tymczasowa jest likwidowana.
Jak widać rekurencja z CTE jest banalnie prosta ponieważ możemy odwołać się do jej samie wewnątrz zapytania które je tworzy.

ale sprawdź sobie jeszcze sam wszystko dokładnie bo to na szybko pisane pozdrawiam.

0

Dzięki bardzo za odpowiedzi, już sobie poradzę :)

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