Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Duzy problem z zapytaniem
Forum PHP.pl > Forum > Bazy danych > MySQL
Black-Berry
Nie wiem czy takie zapytanie wogóle jest możliwe. Opisze moze najpierw moją strukturę tabel...



Teraz jesli chcę wylistować całą strukture to robię zapytanie:
  1. SELECT * FROM tree_structure

Jednak gdybym chciał pobrac tytuł jakiegoś węzła to musze juz wykonac 2 zapytania:
  1. SELECT `reference_id`, `type` FROM tree_structure WHERE `id`=5;
  2. SELECT `title` FROM (/*tabelę określam po typie*/) WHERE id = (/*zmienna `reference_id`*/)

Sprawa komplikuje się gdy chce wylistować wszystkie elementy. Jeśli będę miał ich np 1.000 to nie zrobię przeciez tylu zapytań. Bardzo prosze o pomoc.
ucho
Dla mnie taka struktura bazy jest to tak samo głupi pomysł jak prawie każdy przypadek używania $$nazwa_zmiennej. Co chcesz właściwie osiągnąć ? Kategorie powinny być raczej nadrzędne w stosunku do artykułów/newsów, zapewne zbytnio się nie różnią i mogły by być jedną tabelą, z ewentualnie dodatkowym polem type.
Nawet jak uda się komuś skonstruować jedno zapytanie, które robi to o co Tobie chodzi, to i tak przy obecnej strukturze wypaczasz ideę klucza obcego - powinien on być jednoznacznie połączony z jedną tabelą - inaczej rezygnujesz z mechanizmów utrzymania spójności np. w tej chwili musisz ręcznie usuwać rekord z tree_structure po skasowaniu jakiegoś artykułu.
mike
Przecież ta struktura to pomyłka. Jedyna rada jaką Ci można dać to: zmień to. Przemyśl od nowa i zmień.
Black-Berry
Naprawdę nie widze innego sposobu na zapewnienie struktury drzewiastej. Jeśli dodam nowy typ np 'produkt' to bedzie on miał pola takie jak cena, ilosc, ocena kupujacych, klikniecia, ilosc zamowien, waga, wymiary itd. itd... Przyznasz ze wtedy o wiele bardziej rozni sie to od kategorii.

Edit: Unikatowy identyfikator pola obcego jest tworzony z połaczenia pól 'reference_id' oraz 'type'. Nie rozmumiem skad te beszty. przeciez nie ma innej możliwości. Przynajmniej ja nie potrafię sobie tego wyobrazić. Moze jakies sugestie ?
JoShiMa
Cytat(Black-Berry @ 20.08.2008, 11:15:12 ) *
Naprawdę nie widze innego sposobu na zapewnienie struktury drzewiastej.

To masz słabą wyobraźnię. Strukturę drzewiastą robi się w jednej tabeli. w której odpowiednie pole rekordu wskazuje na ID innego rekordu tej samej tabeli jako na rodzica. To bardzo ogólny przypadek. Dzieś na forum już o tym pisałam.

Jeśli chcesz mieć tabelę kategorii to ok, ale w tabeli produktów dajesz pole w którym jest id kategorii do której produkt należy. Jeśłi zaś dany produkt może należeć do wielu kategorii (a to już niej est struktura drzewiasta) to poza tabelą produktów i tabelą kategorii będziesz musiał zrobić tabelę relacji między id produktu i id kategorii do których produkt nalezy.

Cytat(Black-Berry @ 20.08.2008, 11:15:12 ) *
Nie rozmumiem skad te beszty. przeciez nie ma innej możliwości. Przynajmniej ja nie potrafię sobie tego wyobrazić. Moze jakies sugestie ?

To, że nie umiesz sobie tego wyobrazić nie oznacza, że nie ma innej możliwości. aaevil.gif
Black-Berry
Cytat(JoShiMa @ 20.08.2008, 11:43:04 ) *
To masz słabą wyobraźnię. Strukturę drzewiastą robi się w jednej tabeli. w której odpowiednie pole rekordu wskazuje na ID innego rekordu tej samej tabeli jako na rodzica. To bardzo ogólny przypadek. Dzieś na forum już o tym pisałam.

No i własnie tak działa to co mam. Tabela główa trzyma strukturę, a poszc zególne węzły zapisane są w odzielnych tabelach.

Nie rozumiem w dalszym ciągu w czym rzecz? Może za mało opisałem sposób działania: Struktura drzewiasta trzymana jest w tabeli tree_strukture. Kombinacja pól type oraz reference_id służą do odnalezienia konkretnego węzła.
JoShiMa
Cytat(Black-Berry @ 20.08.2008, 11:59:26 ) *
No i własnie tak działa to co mam. Tabela główa trzyma strukturę, a poszc zególne węzły zapisane są w odzielnych tabelach.

W takim razie graf który narysowałeś nie oddaje tej struktury a po Twoich wyjaśnieniach sugeruje, że zarówno kategoria może być dzieckiem artykułu jak i artykuł może być dzieckiem kategorii. Poza tym nie widzę w tej drzewiastej tabeli połączenia typu rodzić dziecko. Które pole wskazuje na rodzica a które na potomka? połączenia
Black-Berry
Jest pole parent_id oraz pola left_id, right_id (Storing Hierarchical Data in a Database). Nie jest to jednak ważne w moim pytaniu dlatego nie pisałem o tym.

I masz rację. Zarówno artykuł może być dzieckiem kategorii jak i kategoria dzieckiem artykułu ale tylko teoretycznie. W praktyce takie opcje ograniczam za pomocą kreatora struktury. Artykuły też muszą mieć opcje potomków (np. komentarz będzie takim przykładem potomka dla artykułu ale to już nie jest kwestia tego wątku).

edit: Wracając do tematu to jak możnaby inaczej ten problem rozwiązac? Jak zaprojektować strukturę drzewa która na węzłach miałaby elementy różnego typu ? Ma ktoś pomysł ?
dymsza
sprawa jest banalna nie wiem o co tyle debatowania


  1. SELECT
  2. CASE tree.`type` WHEN 1 THEN t1.title
  3. WHEN 2 THEN t2.title WHEN 3 THEN t3.title ELSE '' END;
  4. FROM tree_structure AS tree
  5. LEFT JOIN tabela1 AS t1 ON t1.id = tree.reference_id
  6. LEFT JOIN tabela2 AS t2 ON t2.id = tree.reference_id
  7. LEFT JOIN tabela3 AS t3 ON t3.id = tree.reference_id
  8. WHERE tree_structure.`id`=5;


powpisuje tylko prawidłowe nazwy i będzie grać i buczeć


http://dev.mysql.com/doc/refman/5.0/en/con...-functions.html
Black-Berry
@dymsza rządzisz:)
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.