Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zagnieżdżony SELECT i zmienna głębokość - Pomocy!
Forum PHP.pl > Forum > Bazy danych > MySQL
php1983
Mam pewien problem!
Wyobraźcie sobie baze danych w której w jednej tabeli jest drzewiasta struktóra. Chodzi o to, że każdy element może zawierać być przypisany do innego elementu - rodzica. Ta struktura to ma być drzewko zawierające menu dla stronki www. Każdy element posiada id, nazwe i id_rodziaca, jeżeli id_rodzica=0 to znaczy, że element należy do korzenia drzewa.
Przykład:
  1. id=1; element1; parent=0
    1. id=3; element3; parent=1
      1. id=4; element4; parent=3
    2. id=5; element5; parent=1
  2. id=2; element2; parent=0

...i tak można sobie zagnieżdzać, z tym, że każdy element może mieć wielu sąsiadów.

Problem polega na tym, żeby mając do dyspozycji id dowolnego elementu pobrać jednym zapytaniem sql wszystkich jego sąsiadów, rodzica i sąsiadów rodzica i tak w górę drzewa aż do węzła 0.

Próbowałem SUBQUERY SELECT ale za każdym razem może być inna głębokość drzewa, może jakąś funkcję sql trzeba napisać? Pomocne wszystkie wskazówki albo łącze do jakiegoś rozwiązania. Dzięki!
bpskiba
Problem znany od barddzo dawna smile.gif
Przy takiej strukturze aż się prosi o rekurencję i tak to należy zrobić. Można po stronie serwera mysql - jako funkcję , a można po stronie skryptu php.
Złotego środka w postaci jednego zapytania i wyświetlania wyników niestety nie będzie.
Jeżeli to jest mała tabela np z menu rozwijanym, to pobierz wszystkie rekordy i rekurencyjnie obrób w php
Jeżeli natomiast jest to duża tabela (lub rosnąca), to lepiej przemyśl zmianę struktury lub dodaj więcej pól (np id korzenia)
php1983
Właśnie nie jestem pewien jak taką funkcję napisać - po stronie serwera MySql.

Próbowałem coś takiego:
  1. delimiter //
  2. CREATE PROCEDURE dowhile()
  3. BEGIN
  4. SET @v=6;
  5. WHILE @v > 0 DO
  6. SELECT parent_id INTO @pid FROM categories WHERE id=@v;
  7. SET @v=@pid;
  8. IF @pid>0 then
  9. SET @vx:= @vx+(SELECT * FROM categories WHERE id=@pid);
  10.  
  11. end IF;
  12. END WHILE;
  13. SELECT @vx;
  14. END;//
  15. delimiter ;

@pid - parent_id
@v - do testowania czy nie doszło do korzenia
w @vx - próbowałem rzechować rezultat ostatniego selecta, ale już wiem, że to musi buć jedna kolumna i jeden wiersz i najlepiej skalar - nie działa
kombinowałem jeszcze w pętli @wyjście UNION SELECT costam...

Oczyiście nie działa. Czy w pętli mogę jakoś użyć UNION, żeby przechowywać wynik z SELECTa w poprzednim obrocie pętli?
bpskiba
może gotowiec z netu?
http://explainextended.com/2009/03/17/hier...eries-in-mysql/
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.