Autor | Zpráva | ||
---|---|---|---|
cesar Profil |
#1 · Zasláno: 21. 12. 2009, 00:26:07
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 * |
#2 · Zasláno: 21. 12. 2009, 08:22:09
|
||
cesar Profil |
#3 · Zasláno: 21. 12. 2009, 21:51:05
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 * |
#4 · Zasláno: 21. 12. 2009, 22:06:28
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 * |
#5 · Zasláno: 21. 12. 2009, 22:47:39
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. |
||
Časová prodleva: 7 dní
|
|||
cesar Profil |
#6 · Zasláno: 28. 12. 2009, 15:06:28 · Upravil/a: cesar
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í. |
||
Časová prodleva: 15 let
|
0