test2 Posted February 20, 2009 Report Share Posted February 20, 2009 Tātad mana db izstās šādi: cat |id|name|icon| sub_cat |id|cat_id|name| sub_cat2 |id|sub_cat_id|name| sub_cat3 |id|sub_cat2_id|name| advertisment |id|cat|sub_cat|sub_cat2|sub_cat3|txt|time| Šis, manuprāt, ir visērtāk operējamais koks, vismaz es tā domāju, bet problēma, tur, ka nēesmu īsti liels speciālsists selektu veidošanā, tāpēc gribēju palūgt vai kāds navarētu padalīties ar kodu? Piemēram, ja lapā tiek padots ?cat , izvada visas CAT un apakšā katram CAT - SUB_CAT, bet ja piemēram pieprasa ?cat=1&sub_cat=3 , tad ja eksistē šim te sub_cat - sub_cat2 tad izvelkam arī sub_cat2 saturu, ja nē izvadam sludinājumu listu, jo, piemēram, sadaļas var būt tā: Transports - > Mašīna -> BMW - > 5 litri (kur tiek izmantotas visas sadaļas Bet var būt arī tā Transports -> Citi -> kur tiek pieprasīts tikkai divas sadaļas. Cerams, ka izsteicos skaidri, lūdzu esiet atsaucīgi un pēc iespējas ātrāk, būšu ļoti ļoti pateicīgs! Quote Link to comment Share on other sites More sharing options...
bubu Posted February 20, 2009 Report Share Posted February 20, 2009 Visparastākais where nosacījums: SELECT * FROM adv WHERE cat = $cat SELECT * FROM adv WHERE cat = $cat AND cat2 = $cat2 Quote Link to comment Share on other sites More sharing options...
codez Posted February 20, 2009 Report Share Posted February 20, 2009 Vajag taisīt vienā tabulā, tad 1)viss ir vienkāršāk 2)var būt neierobežoti dziļa struktūra 3)sludinājumam ir vienkārši viens cat_id, kurš norāda, kurā kateogorijā sludinājums ielikts. id|pid|name|icon|depth id - kategorijas id pid- parent kategorijas id name,icon - dati depth - dziļums, lai tu zinātu cik kategorija dziļi Un tad elementārs kverijs. rootam cat.pid norāda 0: SELECT * FROM cat LEFT JOIN cat as cat2 ON cat2.pid=cat.id WHERE cat.pid=0; Kādai kategorijai cat.pid norāda tās kategorijas id SELECT * FROM cat LEFT JOIN cat as cat2 ON cat2.pid=cat.id WHERE cat.pid=1; Quote Link to comment Share on other sites More sharing options...
test2 Posted February 20, 2009 Author Report Share Posted February 20, 2009 (edited) Nu varbūt es īsti nesapratu tavu variantu codez, bet kā pie velna tu taisies vienā tabulā es vnk nespēju saprast, piemēram ja tev ir CAT mašīna un viņai apakšcat MARKA, un MARKAI apakšcat KRAASA, kaa tu to visu vari vienā tabulā, lūdzu nevar kkādu sīkāku piemēru, ar tam daudzajām padziļinātajām sadaļām? UN tas bubu variants vsp nederēs, kā tu vari bez joiniem kko dabūt ārā? Tur jau tā lieta es māku izselektēt kkādas db saturu, bet ja piemēram man vajag izselektēt db saturu plus šim te saturam konkurētajam ID atrast no citas tabulas datus, es nez es laikam nemāku paskaidrot :( AA un vel viena lieta, ko es īsti nesaprotu, pieņemsim, man ir šāds selekts: $query = "SELECT cat.id, cat.name, sub_cat.id, sub_cat.name ". "FROM cat LEFT JOIN sub_cat ". "ON cat.id = sub_cat.cat_id"; Tad, kā es varu izvadīt CAT tabulas name kā virsrakstu un apakšā nolistot visus atrastos SUB_CAT names, un tā katram CAT? Edited February 20, 2009 by test2 Quote Link to comment Share on other sites More sharing options...
codez Posted February 20, 2009 Report Share Posted February 20, 2009 tabula cat: id|pid|name 1 0 Auto 2 0 Nekustamie Ipasumi 3 1 Opel 4 1 Audi 5 1 Volvo 6 3 Omega 7 3 Astra 8 4 A4 9 4 A6 pid tev norāda, kurā kategoijā ietilpst dotā kategorija. Lai piemēram dabūtu visas markas zem auto, taisi SELECT * FROM cat WHERE pid=1 Lai dabūtu visas markas un modeļus, taisi: SELECT * FROM cat LEFT JOIN cat as cat2 ON cat2.pid=cat.id WHERE cat.pid=1; Quote Link to comment Share on other sites More sharing options...
codez Posted February 20, 2009 Report Share Posted February 20, 2009 (edited) Tavā gadījumā rootam būs kaut kas tāds: SELECT * FROM cat LEFT JOIN sub_cat ON sub_cat.cat_id=cat.id; Attiecīgi dziļāk, zem cat kategorijas, piemēram, 7, būs: SELECT * FROM sub_cat LEFT JOIN sub_cat2 ON sub_cat2.sub_cat_id=sub_cat.id WHERE sub_cat.cat_id=7; Edited February 20, 2009 by codez Quote Link to comment Share on other sites More sharing options...
test2 Posted February 20, 2009 Author Report Share Posted February 20, 2009 Tavs variants īstenībā ir baigi labais, tikkai es te mocos vislaik ar vienu lietu, piemēram ja es izvelku visu to kopēju listu sajoinoju cat ar sub_cat, kā es varu uztaisīt tā lai to CAT name izvada vienu reizi un tad tos sub_cat datus tik cik viņi ir, respektīvi ja es to visu joinu ielieku ciklā un izvadu man tas cat arī atkārtojas līdz ar katru sub_cat name, kā izdarīt lai neatkārtojas? Quote Link to comment Share on other sites More sharing options...
codez Posted February 20, 2009 Report Share Posted February 20, 2009 Sakārto pēc cat.name un tad ciklā, kad izvadi, piešķir pagaidu mainīgajam, ja nākamais sakrīt ar pagaidu mainīgo, tad neizvadi, ja nesakrīt, tad izvadi un nomaini pagaidu mainīgo. while (...){ if ($tmp!=$row['catname']){ $tmp=$row['catname']; echo $tmp; } } Quote Link to comment Share on other sites More sharing options...
test2 Posted February 20, 2009 Author Report Share Posted February 20, 2009 Paldies codez tagad viss sapratu - tu esi pats labākais palīgs! :) Quote Link to comment Share on other sites More sharing options...
test2 Posted February 20, 2009 Author Report Share Posted February 20, 2009 (edited) Atvainojos par double post, bet, man veljopojām neizvadas, kā vajag ( ja noņem GROUP BY, tad izvadas viss, taču nname nezkāpēc atkārtojas līdz ar kname) , varbūt esmu kko aizmirsis?: <?php $query = "SELECT cat.id, cat.name as nname, sub_cat.id, sub_cat.name as kname FROM cat LEFT JOIN sub_cat ON sub_cat.cat_id=cat.id GROUP BY cat.name"; $result = mysql_query($query) or die(mysql_error()); while($row=mysql_fetch_assoc($result)){ if ($tmp!=$row['nname']){ $tmp=$row['nname']; } echo "<h1>".$tmp."</h1><br />\n"; echo $row['kname']."<br />\n"; } ?> Edited February 20, 2009 by test2 Quote Link to comment Share on other sites More sharing options...
bubu Posted February 21, 2009 Report Share Posted February 21, 2009 UN tas bubu variants vsp nederēs, kā tu vari bez joiniem kko dabūt ārā? Nu tu jau īsti nepateici, kas tev ir vajadzīgs. Es sapratu, ka tu gribi sludinājumu sarakstu izvilkt no norādītajām kategorijām/apakškategorijām ārā. Kategoriju izvilkšanai, protams, ka atliek tik papildus JOIN'u pielikt klāt. Tavā pēdējā postā GROUP BY gan nevajag lietot. Tas tev izvadīs tikai vienu ierakstu no katras kategorijas, nevis visus. Es ceru, ka tu saproti, ko tas dara, nevis uz dullo kodā kautko mēģini? Lai nu kā, vai tev dati pareizi salikti tabulā, ja jau saki, ka nesagaidi to ko gribi, lai izvadās? Kas precīzi tev izvadās nepareizi? Lai tas if's strādātu kā gribi, tad tiem nname jānāk sakārtotā kārtībā selekta rezultātā - tb pieliec klāt sakārtošanu kverijam pēc nname vērtībām. Quote Link to comment Share on other sites More sharing options...
test2 Posted February 21, 2009 Author Report Share Posted February 21, 2009 Nu kā man katrs id ir INT 11 un name VARCHAR 255, problēma ir tur ka virsraksts atkal vislaika atkārtojas, un ar to sakārtošanu tu domā ORDER BY? Quote Link to comment Share on other sites More sharing options...
codez Posted February 21, 2009 Report Share Posted February 21, 2009 (edited) jā, taisi ORDER BY cat.name; P.S. Un vēl tavā kodā $tmp vajag drukāt iekš IFa, šādi: if ($tmp!=$row['nname']){ $tmp=$row['nname']; echo "<h1>".$tmp."</h1><br />\n"; } echo $row['kname']."<br />\n"; P.S.2 Vispār to ORDER BY tev nevajag, jo tiem cat.name pēc JOINa tāpat vienādiem jābūt pēc kārtas. Edited February 21, 2009 by codez Quote Link to comment Share on other sites More sharing options...
test2 Posted February 21, 2009 Author Report Share Posted February 21, 2009 (edited) Bet tik un tā virsraksts ākā cat name atkārtojas līdz ar katru sub_cat name ;( Kur vel varētu būt problēma? EDIT: VISS SANaaca paldies liels! A tu nevari man izstāstīt sīkāk par to tavu tabulu? Piemēram, kā caur admina paneli pievienos jaunas kateg un sadaļas, jo manliekas tur būs bik šarežģītāk tieši ar to kā tās sadaļas moderēt, varbūt tev ir gatavs kods? Edited February 21, 2009 by test2 Quote Link to comment Share on other sites More sharing options...
codez Posted February 21, 2009 Report Share Posted February 21, 2009 Inicializē $tmp=''; koda sākumā un parādi, kas tev izvadās un kādas tev ir tās 2 tabulas. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.