Dynamicznie budowane menu w MySQL


(northwest) #1

Witam serdecznie,

Mam takie pytanko, mam takie tabele:

CREATE TABLE IF NOT EXISTS `cms_kategorie` (

  `bf_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,

  `nazwa` varchar(120) COLLATE utf8_unicode_ci DEFAULT NULL,

  `enable` char(1) COLLATE utf8_unicode_ci NOT NULL,

  UNIQUE KEY `id` (`bf_id`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


CREATE TABLE IF NOT EXISTS `cms_podkategorie` (

  `bf_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,

  `nazwa` varchar(120) COLLATE utf8_unicode_ci DEFAULT NULL,

  `enable` char(1) COLLATE utf8_unicode_ci NOT NULL,

  `kategoria` int(11) NOT NULL,

  `podkategoria` int(11) NOT NULL,

  UNIQUE KEY `id` (`bf_id`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci


REATE TABLE IF NOT EXISTS `cms_podpodkategorie` (

  `bf_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,

  `nazwa` varchar(120) COLLATE utf8_unicode_ci DEFAULT NULL,

  `enable` char(1) COLLATE utf8_unicode_ci NOT NULL,

  UNIQUE KEY `id` (`bf_id`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

chciałbym w zbudować menu na zasadzie: - kategoria -- podkategorie --- podpodkategorie Czy da się to jakoś w 1 zapytaniu wyświetlić? Ew. w php? Próbowalem czymś takim:

$tablicaAA = $ms->query_select("select bf_id, nazwa from cms_kategorie WHERE enable = '1' ORDER by nazwa ASC;");

if (isset($tablicaAA)) {

    foreach ($tablicaAA as $wynAA => $warttAA) {

      $tablicaa[] = array("name" => $warttAA['nazwa'], "id" => $warttAA['bf_id']);

      $tablicaB = $ms->query_select("select bf_id, nazwa, podkategoria from cms_podkategorie WHERE kategoria = '" . $warttAA['bf_id'] . "' and enable = '1' ORDER by nazwa ASC;");

        if (isset($tablicaB)) {

            foreach ($tablicaB as $wynB => $warttB) {

                $tablicaa[] = array("name" => "$warttB[nazwa]", "id" => $warttB['bf_id']);

                $tablicaC = $ms->query_select("select bf_id, nazwa from cms_podpodkategorie WHERE bf_id = '" . $warttB['podkategoria'] . "' and enable = '1' ORDER by nazwa ASC;");

                if (isset($tablicaC)) { 

                    foreach ($tablicaC as $wynC => $warttC) {

                        $tablicaa[] = array("name" => "$warttC[nazwa]", "id" => $warttC['bf_id']);

                    }

                }

            }

        }

    }

}

[/code]

Problem w tym, że w wyniku działania tego skryptu otrzymuję:

Kategoria

  • podpodkategoria 1

  • podkategoria 1

  • podpodkategoria 1

  • podkategoria 2

Czyli nie dość że nie wyświetla w poprawnej kolejności, to jeszcze powiela podpodkategorie :frowning:

Ma ktoś pomysł na to może?

Northwest


(pain3hp) #2

po co trzy tabele, a jak będziesz chciał 4 level menu to zrobisz czwartą?

Ja bym zrobił tak:

ID|BOX(boolean)|toBox(int do ID)|category(VARCHAR)

czyli masz boxy i kazdej pozycji do boxa menu ustawiasz id w toBox, boxy toBox mają =0;

PHP:

1.wyciągasz * WHERE BOX='1' AND toBox='0'

2.foreach przez wszystkie pozycje i do każdego wyciągasz rekordy równe ID=toBox

Jeżeli coś jest boxem czyli ma BOX='1' i toBOX>0 to znaczy że jest boxem 2-ego levelu, wtedy analogicznie jedziesz drugim foreachem i dołączasz toBoxy do ID ich


(northwest) #3

te "drzewka" znam :slight_smile: tylko problem w tym że nie mogę zmieniać układu tabel :frowning: dotychczas były tylko 2 poziomy, teraz doszedł 3 :confused:

da się to jakoś w tej chwili postawić żeby działało poprawnie? macie może jakiś pomysł?:slight_smile:


(pain3hp) #4

jak podasz tabele z danymi to Ci zrobię bo tak to mi się nie chce... :slight_smile:


(northwest) #5

oto dane:

CREATE TABLE IF NOT EXISTS `cms_kategorie` (

  `bf_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,

  `nazwa` varchar(120) COLLATE utf8_unicode_ci DEFAULT NULL,

  `enable` char(1) COLLATE utf8_unicode_ci NOT NULL,

  UNIQUE KEY `id` (`bf_id`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=3 ;


INSERT INTO `cms_kategorie` (`bf_id`, `nazwa`, `enable`) VALUES

(1, 'kategoria 1', '1'),

(2, 'kategoria 2', '1');


CREATE TABLE IF NOT EXISTS `cms_podkategorie` (

  `bf_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,

  `nazwa` varchar(120) COLLATE utf8_unicode_ci DEFAULT NULL,

  `enable` char(1) COLLATE utf8_unicode_ci NOT NULL,

  `kategoria` int(11) NOT NULL,

  `podkategoria` int(11) NOT NULL,

  UNIQUE KEY `id` (`bf_id`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=15 ;


INSERT INTO `cms_podkategorie` (`bf_id`, `nazwa`, `enable`, `kategoria`, `podkategoria`) VALUES

(1, 'grupa1', '1', 1, 1),

(2, 'grupa2', '1', 1, 2),

(13, 'grupa3', '1', 1, 3);



CREATE TABLE IF NOT EXISTS `cms_podpodkategorie` (

  `bf_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,

  `nazwa` varchar(120) COLLATE utf8_unicode_ci DEFAULT NULL,

  `enable` char(1) COLLATE utf8_unicode_ci NOT NULL,

  UNIQUE KEY `id` (`bf_id`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=5 ;




INSERT INTO `cms_podpodkategorie` (`bf_id`, `nazwa`, `enable`) VALUES

(1, 'Podkategoria 1', '1'),

(2, 'Podkategoria 2', '1'),

(3, 'Podkategoria 3', '1'),

(4, 'Podkategoria 4', '2');

:slight_smile:


(pain3hp) #6

a gdzie jest klucz obcy do podpodkategorii?? Kto Ci tą baze zrobił chłopie.... jej konstrukcja jest przerażająca ja się poddaję.

w cms_podpodkategorie powinno być pole podkategoria bo tak to nie wiadomo co to za relacje w ogóle są.