andrisp Posted January 9, 2006 Report Share Posted January 9, 2006 domaaju par katalogu sisteemu, kuraa iespeejams veidot n-to liimenju apakshkategorijas, tas ir, kategorija -> subkategorija -> subsubkategorija -> subsubsubkate.. utt. Domaaju to dariit ar shaadu vienkaarshu tabulu (kataloga mugurkauls): ID | parent_cat_id | cat_name ID - unikaals peec kaa atpaziist kategorija parent_cat_id - taas kategorijas ID zem kuras atrodas apakshkategorija cat_name - kategorijas nosaukums 0 liimenja kategorijaam parent_cat_id buutu 0, apakshkategorijaam parent_cat_id buutu taas kategorijas ID, zem kuras taa atrodas. +/- shim konceptam ? Varbuut ir labaaks veids kaa veidot n-liimenju katalogu sisteemas ? paldies Link to comment Share on other sites More sharing options...
litt Posted January 9, 2006 Report Share Posted January 9, 2006 (edited) Vēl ieteiktu pievienot child_count kolonnu. Dažos gadījumos tas ir visai noderīgi child_count - cik lapas/ieraksti ir tieši zem esošā (parent) ieraksta Edited January 9, 2006 by litt Link to comment Share on other sites More sharing options...
Delfins Posted January 9, 2006 Report Share Posted January 9, 2006 Ja vajadzēs meklēšana no ROOT (vai citas ne-beigu-kategorijas (not-LEAF) )... tad labāk kešot visu parent child ID ar komatiem.. ParentChilds = "45,23,77" lai nevajadzētu katru reizi taisīt query uz visiem SubTree.. vēlāk pie meklēšanas pielikot tikai WHERE ItemCatId IN ('.$rootCat->ParentChilds.') PS: PgSQL tas ir easy.. uztaisam storēto proc. un dzīvojam mierīgi. Link to comment Share on other sites More sharing options...
Blackout Posted January 9, 2006 Report Share Posted January 9, 2006 Vēl ieteiktu pievienot child_count kolonnu. Dažos gadījumos tas ir visai noderīgi child_count - cik lapas/ieraksti ir tieši zem esošā (parent) ieraksta nevaig to child_count to var paveikt ar to pashu parent_cat_id. where parent_cat_id=".$tagadejasadala." nu domu sapratat :) Link to comment Share on other sites More sharing options...
Delfins Posted January 9, 2006 Report Share Posted January 9, 2006 Blackout, kāpēc tu vienmēr stīdies, un vienmēr `neapreizi`.. Visos gadījumos, kad izmantoju Tree, child_count ir 100% nepieciešams.. kaut vai perfomance uzlabošanai (pamatā) Link to comment Share on other sites More sharing options...
andrisp Posted January 9, 2006 Author Report Share Posted January 9, 2006 es meegjinu visaadiigi izdomaat kodu, kam padodod kautkaadas apakshsadaljas ID, automaatiski tiktu sagjenereeti listes arii augstaak staavoshaas kategorijas. ilustraacijai: <ul> <li>Root #1</li> <li>Root #2</li> <li>Root #3</li> <ul> <li>Subcat #1</li> <li>Subcat #2</li> <ul> <li>Subsubcat #1</li> <li>Subsubcat #2</li> <ul> <li>Subsubsubcat #1</li> <li>Subsubsubcat #2</li> </ul> <li>Subsubcat #3</li> </ul> <li>Subcat #3</li> </ul> <li>Root #4</li> </ul> Piem, es uztaisu pieprasiijumu katalogs.php?cat=20, kur 20 ir 'Subsubcat #2' ID, un mans kods automaatiski sagjeneree gan hiarhijaa augstaakstaavoshaas kategorijas, gan savas child kategorijas. Zinu, ka izklausaas peec gatava koda pieprasiijuma, bet esmu nokuupinaajis savu galvu melnu, un nevaru izdomaat, kaa lai to izdara. Link to comment Share on other sites More sharing options...
Delfins Posted January 9, 2006 Report Share Posted January 9, 2006 Pie saglabāšanas ģenerē koku un liec kādā laukā... a pati ģenerēšana ir rekursīva vai nu PHP, vai DB galā (Oracle,PGSQL, ar MySQL baidos teikt... ;) ) Link to comment Share on other sites More sharing options...
andrisp Posted January 9, 2006 Author Report Share Posted January 9, 2006 es tieshi to rekursiivo gjenereeshanu nesaprotu (nekad neko neesmu rekursiivi dariijis).. varbuut vari konceptu uzskiceet ? Link to comment Share on other sites More sharing options...
teror Posted January 9, 2006 Report Share Posted January 9, 2006 (edited) šitas no manuāļa $BASEDIR="/tmp"; function recurse_array($array) { foreach($array as $arr) { if (is_array($arr)) { recursedir($arr); } else { //sheit daram visas lietas echo $arr; } } } recursedir($array); Edited January 9, 2006 by teror Link to comment Share on other sites More sharing options...
Delfins Posted January 9, 2006 Report Share Posted January 9, 2006 varēji jau pats netā sameklēt... function rekursija( rootId ) { select .. where parentId = rootId $cnt = 0; while ( $obj = .. ) { if ( rootId == $obj->id ) continue; // Lai nav muuzigais cikls rekursija( $obj->id ); $cnt++; } return $cnt; } Link to comment Share on other sites More sharing options...
Blackout Posted January 9, 2006 Report Share Posted January 9, 2006 (edited) Blackout, kāpēc tu vienmēr stīdies, un vienmēr `neapreizi`.. Visos gadījumos, kad izmantoju Tree, child_count ir 100% nepieciešams.. kaut vai perfomance uzlabošanai (pamatā) Es jau nestrīdos, bet kāpēc nepareizi? ja tev vaig uszināt cik subkategoriju tavam katalogam kapēc neizmantot šito? : $k_query = mysql_query("SELECT * FROM katalogi WHERE parent_cat_id='".$katalogs."'"); $num_k = mysql_num_rows( $k_query ); if ( $num_k != 0 ) { echo("$num_k"); //izdos cik subkatalogu } else { echo('Nav neviena subkataloga'); } kas tur nepareizs? Edited January 9, 2006 by Blackout Link to comment Share on other sites More sharing options...
v3rb0 Posted January 9, 2006 Report Share Posted January 9, 2006 (edited) Blackout : daudz kas nepareizs. skaitīt cik ierakstu ar num_rows() ir 'pareizi', selektēt visus laukus, ja tev vajag tikai vienu ciparu, kas ir chaildu skaits nodei, ir vienkārši super! Edited January 9, 2006 by v3rb0 Link to comment Share on other sites More sharing options...
Delfins Posted January 9, 2006 Report Share Posted January 9, 2006 Blackout, nu nestrīdies ar pieredzējušiem.. Kā jau verbo teica, tavā piemērā ir vairākas kļūdas 1.) lai saskaitītu, tu selektē visus laukus 2.) skaitu dabū no num_rows() 3.) skaits tiek dabūts ar papildus query (arī sub-query ir papildus query) 4.) on-line režīmā šitais neder, jo veido nevajadzīgu noslogojumu Risinājums šitām problēmā jau sen zināms: 1.) izveidojam ChildCount un updeitojam pie ieraksta pielikšanas 2.) skaitīšanai izmanto SQL count() f-ju Link to comment Share on other sites More sharing options...
Blackout Posted January 9, 2006 Report Share Posted January 9, 2006 Labi piekrītu :). nākotnē izmantošu tavu metodi :) Link to comment Share on other sites More sharing options...
andrisp Posted January 10, 2006 Author Report Share Posted January 10, 2006 (edited) ko es daru nepareizi ? function rekursija($parentID) { $query = mysql_query("SELECT * FROM `dokumenti_categories` WHERE parent_cat_id = ".$parentID); $html .= '<ul>'; while ($row = mysql_fetch_assoc($query)) { $html .= '<li>'.$row['cat_name'].'</li>'; $subquery = mysql_fetch_array(mysql_query("SELECT COUNT(ID) FROM `dokumenti_categories` WHERE parent_cat_id = ".$row['parent_cat_id'])); if ($subquery[0] != 0) { $html .= rekursija($row['parent_cat_id']); } } $html .= '</ul>'; return $html; } echo rekursija(0); man vispaar nekas nenotiek.. apacis atsuuta, ka dokuments nemaz neeksistee.. kad izkomenteju aaraa sho kodu, tad dokuments gan atrodas.. pieljauju, ka mana rekursija nokarina php vai aiziet muuzhiigajaa loopaa.. kas par vainu ? Atradu kļūdu! ieksh $subquery selecta jaabuut bija parent_cat_id = '.$row['ID'] un ieksh tur kur $html .= rekursija($row['parent_cat_id']) ir tas pats - jaabuut $row['ID']; Edited January 10, 2006 by andrisp Link to comment Share on other sites More sharing options...
Recommended Posts