Wyszukiwanie w MySQL i wyświetlanie produktów na podstawie "drzewa" kategorii

0

Witam,
Mam taką bazę kategorii:

CREATE TABLE IF NOT EXISTS `multikategorie` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `parent_id` bigint(20) unsigned NOT NULL,
  `position` bigint(20) unsigned NOT NULL,
  `left` bigint(20) unsigned NOT NULL,
  `right` bigint(20) unsigned NOT NULL,
  `level` bigint(20) unsigned NOT NULL,
  `title` text COLLATE utf8_unicode_ci,
  `type` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;

 

Najniższy poziom zagłębienia jaki mam to level = 12.

Chce zrobić:

  • listę kategorii po kliknięciu której zobaczymy WSZYSTKIE produkty mieszczące się w wybranym parencie "w dół".

Czyli jeśli mamy np takie kategorie:

  • Samochody
    -- Osobowe
    --- Skoda
    ----- Rapid
    ------- Części
    -------- Elektronika
    ---------- Komputery
    ----- Octavia
    ----- SuperB
    ----- Fabia
    --- Opel
    --- Peugeot
    --- Mazda

I ktoś kliknie np. w samochody - to wyświetlą mu się wszystkie produkty należące do kategorii "SAMOCHODY".
W momencie gdy klikniemy na "RAPID" to wyświetlą się nam produkty należące do kategorii: rapid / części / elektronika / komputery.

Mam taką bazę produktów:

CREATE TABLE IF NOT EXISTS `produkty` (
  `bf_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `nazwa` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `kategoria` bigint(20) DEFAULT NULL,
  `cena` double NOT NULL,
  UNIQUE KEY `id` (`bf_id`),
  FULLTEXT KEY `nazwa` (`nazwa`,`dostepnosc`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;
 

Próbowałem ten problem rozwiązać w ten sposób:

 
$tablicaA = $ms->query_select("SELECT a.id, a.title, a.parent_id FROM multikategorie a, (SELECT b.id FROM multikategorie b, (SELECT id FROM multikategorie c WHERE c.id = " .($sqlzap) . ") AS foo WHERE b.parent_id = foo.id OR b.id = foo.id ) AS foo2 WHERE a.parent_id = foo2.id OR a.id = foo2.id GROUP BY a.id;");
    if (isset($tablicaA)) {
        $sssss .= " kategoria IN (";
        foreach ($tablicaA as $wynA => $warttA) {
            if ($warttA[parent_id] != "0") {
                $qwex = 1;
                $sssss .= "   $warttA[id] , ";
}}
 

Co w wyniku zwracało mi zapytanie do wyświetlania produktów:

SELECT * FROM produkty WHERE cent <>''  and ( kategoria IN ( 325193 , 325412 , 325461 ....... dziesiątki id ......... ) ) ORDER by nazwa ASC 
 

Wszystko byłoby okey gdyby nie to, że mam podgląd tylko do poziomu "niżej" - a nie od tego w którym się aktualnie znajduje -> "do końca".

I tak np. będąc w kategorii "RAPID" - nie mam produktów, ale już wchodząc do KOMPUTERY mam ich bardzo wiele.

Wie ktoś może jak zmienić powyższe zapytania aby całość była widoczna?

0

W Oracle jest takie coś jak

connect by prior

, które umożliwia zrobienie tego co potrzebujesz (czyli hierarchiczne zapytanie).
Może poniższy link coś Ci podpowie:
http://explainextended.com/2009/03/17/hierarchical-queries-in-mysql/

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