Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Duzy problem z zapytaniem, Dołączony schemat :)
Black-Berry
post
Post #1





Grupa: Zarejestrowani
Postów: 663
Pomógł: 6
Dołączył: 3.06.2007
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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.

Ten post edytował Black-Berry 20.08.2008, 09:35:52


--------------------
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 9)
ucho
post
Post #2





Grupa: Zarejestrowani
Postów: 300
Pomógł: 32
Dołączył: 31.07.2006

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
mike
post
Post #3





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

Ostrzeżenie: (0%)
-----


Przecież ta struktura to pomyłka. Jedyna rada jaką Ci można dać to: zmień to. Przemyśl od nowa i zmień.
Go to the top of the page
+Quote Post
Black-Berry
post
Post #4





Grupa: Zarejestrowani
Postów: 663
Pomógł: 6
Dołączył: 3.06.2007
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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 ?


--------------------
Go to the top of the page
+Quote Post
JoShiMa
post
Post #5





Grupa: Zarejestrowani
Postów: 1 374
Pomógł: 149
Dołączył: 1.03.2006

Ostrzeżenie: (0%)
-----


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


--------------------
Go to the top of the page
+Quote Post
Black-Berry
post
Post #6





Grupa: Zarejestrowani
Postów: 663
Pomógł: 6
Dołączył: 3.06.2007
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post
JoShiMa
post
Post #7





Grupa: Zarejestrowani
Postów: 1 374
Pomógł: 149
Dołączył: 1.03.2006

Ostrzeżenie: (0%)
-----


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


--------------------
Go to the top of the page
+Quote Post
Black-Berry
post
Post #8





Grupa: Zarejestrowani
Postów: 663
Pomógł: 6
Dołączył: 3.06.2007
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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ł ?

Ten post edytował Black-Berry 28.08.2008, 12:57:28


--------------------
Go to the top of the page
+Quote Post
dymsza
post
Post #9





Grupa: Zarejestrowani
Postów: 62
Pomógł: 4
Dołączył: 24.08.2006

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Black-Berry
post
Post #10





Grupa: Zarejestrowani
Postów: 663
Pomógł: 6
Dołączył: 3.06.2007
Skąd: Kraków

Ostrzeżenie: (0%)
-----


@dymsza rządzisz:)

Ten post edytował Black-Berry 9.10.2008, 22:30:30


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 07:34