ďťż

[php]Określanie wielu kategorii dla 1 pozycji

       

Podstrony


telcocafe

Dotychczas chyba nigdy nie pytałem się jak coś rozwiązać, gdyż wszystko udawało mi się rozwiązać samemu lub znaleźć w sieci. Tym razem muszę spytać, gdyż nie potrafiłem znaleźć nic ciekawego na ten temat, a może po prostu nie potrafię tego dokładnie określić. Ale do rzeczy:

Jestem w trakcie tworzenia aplikacji przy użyciu CodeIgniter i modelu Nested sets do tego frameworka.

Tabela kategorii wygląda tak:

CREATE TABLE `categories` ( `id` smallint(6) NOT NULL auto_increment, `name` varchar(100) default NULL, `description` varchar(255) default NULL, `leftval` int(5) NOT NULL, `rightval` int(5) NOT NULL, PRIMARY KEY (`id`) )
Sama obsługa tego modelu kategorii nie przysparza problemów, jednak problem pojawił się kiedy mój znajomy zaproponował stworzenie obsługi artykułów, ale z opcją wyboru nieskończenie wielu kategorii, do których dany artykuł mógłby być przypisany.

Uznałem, że najlepszym rozwiązaniem będzie stworzenie nowej tabeli o następującej strukturze:

CREATE TABLE `cat_ascribes` ( `articleid` int(11) NOT NULL, `categoryid` smallint(6) NOT NULL )

Do tej tabeli zapisywane by były informacje o id artykułu i kategorii, co zresztą łatwo odczytać. Jednakże zapisywane by było tylko ID kategorii najniżej położonej w drzewie.

I wszystko byłoby ładnie, ale... tu właśnie jest sedno problemu. Mając takie kategorie:
    l[1]Informacje[8]
      l[2]Z regionu[7]
        l[3]Opole[4]
        l
        l[5]Częstochowa[6]l
      l
    l
I przykładową tabelę artykułów:

CREATE TABLE `articles` ( `id` int(11) NOT NULL auto_increment, `title` varchar(255) NOT NULL, `content` text NOT NULL, PRIMARY KEY (`id`) )

Nie potrafię wymyślić dobrego sposobu na odczytanie wszystkich artykułów z podkategorii danego węzła. Przykład: do kategorii Informacje->z regionu->Opole i Informacje->z regionu->Częstochowa mam przypisane po 2 pozycje, które tyczą się obu miast(czyli 2x to samo articleid z innym categoryid w tabeli cat_ascribes), oraz po jednym artykule oddzielnym. Chciałbym odczytać wszystkie te 4 wpisy, przechodząc do kategorii Z regionu. Rozumiem, że najpierw należałoby pobrać id wszystkich podkategorii(czyli id Częstochowa i Opole), a następnie pobrać pozycje których categoryid = id tych kategorii.

Jak to zrobić najoptymalniej? Może ktoś już opracował takie rozwiązanie i wyszło mu to lepiej? Czekam na informacje i z góry za wszystkie dziękuję.
Użytkownik marrek13 edytował ten post 18 sierpień 2007, 11:01


pogooglaj za -> drzewa mysql php

Bełdzio, czy przeczytałeś chociaż mój post?

Nie mam problemów z drzewkami mysql, ale z tym, jak pobrać dane ze wszystkich podkategorii, kiedy w grę wchodzi przypisanie danej pozycji do wielu kategorii.

Jeśli dobrze zrozumiałem...

A nie myślałeś najprościej :P ?
Dajesz jedną komórkę dla każdego artykuł i tyle :P Nazwij ją np. cats i do niej pakuj IDy kategorii wraz ze znakiem oddzielającym, np. "1|345|34|65" - poza tym, mogą tu być również IDy podkategorii. Jak to oprogramujesz w PHP to zależy od Ciebie :)

A jeśli chcesz wyszukać te same IDy czy coś, pobierasz wszystkie komórki, explodujesz i szukasz tych samych :P
Jakoś to da się zrobić, jednak pewności nie mam, czy w ogóle poprawnie zrozumiałem Twój problem ;)



Zrozumiałeś poprawnie, ale... nie do końca ;)

Sposób przedstawiony przez Ciebie jest jak dla mnie jeszcze gorszym rozwiązaniem, bo przy dużej ilości artykułów pobieranie całej bazy aby wyszukać odpowiednie mija się z celem i niepotrzebnie obciąża serwer(nie jestem żadnym maniakiem wydajności, tylko w tym wypadku różnica byłaby bardzo znacząca, tym bardziej że będzie to duży serwis).

Po dłuższym zastanowieniu wydaje mi się, że nie uniknę skorzystania z przynajmniej 2 zapytań do bazy w celu pobrania odpowiednich artykułów, ale poczekam jeszcze trochę, być może ktoś jeszcze zmieni mój punkt widzenia.

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • nvm.keep.pl

  • Sitedesign by AltusUmbrae.