Autor Zpráva
cesar
Profil
Zdravím všechny,
mám takový menší problém. :-)

CREATE TABLE IF NOT EXISTS `kategorie` (
  `id_kategorie` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `kategorie_id_kategorie` int(10) unsigned DEFAULT NULL,
  `kat_nazev` varchar(80) COLLATE utf8_czech_ci NOT NULL,
  `kat_seo_nazev` varchar(80) COLLATE utf8_czech_ci NOT NULL,
  `kat_seo_popis` varchar(255) COLLATE utf8_czech_ci DEFAULT NULL,
  `kat_klicova_slova` varchar(255) COLLATE utf8_czech_ci DEFAULT NULL,
  `kat_neaktivni` datetime DEFAULT NULL,
  PRIMARY KEY (`id_kategorie`),
  KEY `idx_kategorie_kategorie` (`kategorie_id_kategorie`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci AUTO_INCREMENT=6 ;


Jedná se o kategorie webu. Když je kategorie_id_kategorie NULL, tak je to rodič a když má kategorie_id_kategorie hodnotu rodiče, je to potomek. Bohužel jsem se dostal k problému, že ať píšu jak chci SQL dotaz, bohužel mi to vždycky seřadí špatně. Nemáte s tímto někdo zkušenost nebo tip, jak napsat sql dotaz? Já ho mám napsaný takhle:

SELECT k1.id_kategorie AS id_kategorie, k1.kategorie_id_kategorie AS nadrazena_kategorie, k1.kat_nazev AS nazev_kategorie, k1.kat_seo_nazev AS seo_nazev_kategorie, k1.kat_neaktivni AS neaktivni FROM kategorie AS k1 LEFT JOIN produkty AS p ON p.kategorie_id_kategorie = k1.id_kategorie WHERE 1 = 1 GROUP BY k1.id_kategorie


Nicméně to je bohužel špatně. Předem moc díky za rady.
Kajman_
Profil *
Mrkněte na toto
http://interval.cz/clanky/metody-ukladani-stromovych-dat-v-relacnich-databazich/
http://php.vrana.cz/traverzovani-kolem-stromu-prakticky.php
cesar
Profil
No právě, že toto jsem se snažil nějak studovat, ale příjde mi to trošku až moc na to moje řešení. :-( Ano, šlo by to řešit stylem, že v cyklu budu dávat další sql dotaz(jak je to myslím na tom intervalu), ale to mi příjde trošku prasácké řešení.
123456789
Profil *
Ani pořádně nepíšete, co vlastně chcete vypsat(?) V tom Vašem dotazu spojujete tabulky kategorie a produkty, přitom nikde jinde o tabulce produkty nevidím ani zmínku.

Pokud chcete vypsat na jednom řádku atributy patřící potomkovi a zároveň rodiči, tak je to jednoduchý left join, viz. třeba můj skromný dotaz:

SELECT potomek.id_kategorie, potomek.kat_nazev, rodic.kat_nazev [a případně další] FROM kategorie AS potomek LEFT JOIN kategorie AS rodic ON potomek.kategorie_id_kategorie = rodic.id_kategorie [případně další klauzule];
Kajman_
Profil *
cesar:
Právě v tom článku je vysvětlené, jak to ladně udělat, aby nebyly nutné poddotazy.

Pokud se Vám ladné traverzování nelíbí, tak někdo to dělá i tak, že si celou navigaci nahraje v php do pole a rekurzivně sis ji seřadí až tam.
cesar
Profil
123456789:
Právě, že ani ten dotaz to neudělá správně. Vypíše mi toto:

id_kategorie | kat_nazev | kat_nazev
1 | Aktivní prvky | NULL
2 | Patchkordy 2 | Další nadřazená kategorie
3 | Něco 1 | Aktivní prvky
4 | Další nadřazená kategorie | NULL
5 | Další podřazená kategorie | Další nadřazená kategorie

A měl by vypsat:

id_kategorie | kat_nazev | kat_nazev
1 | Aktivní prvky | NULL
3 | Něco 1 | Aktivní prvky
4 | Další nadřazená kategorie | NULL
5 | Další podřazená kategorie | Další nadřazená kategorie
2 | Patchkordy 2 | Další nadřazená kategorie - protože tady u toho řádku je kategorie_id_kategorie = 4 a nikoli 1

Jsem už opravdu zoufalý z této situace a ať to řešíme jak chci a hodiny, nějak pořád nemůžu najít řešení. Díky moc předem za radu či nakopnutí.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: