[ boccio @ 19.02.2004. 21:37 ] @
Imam ovakvu situaciju:
2 tabele - kategorije i članci. Ispis treba da bude ovakav:
------------------
Kategorija_1
(ukupno xx članaka u kategoriji)

Kategorija_2
(ukupno...)
-----------------
I to radim sa query-jem
Code:

SELECT c.category, c.id, COUNT(a.id) AS ArticleNumber 
FROM tblCategories c 
LEFT JOIN tblArticles a ON c.id=a.category_id 
GROUP BY c.category
ORDER BY c.id

Stvar fercera...e, sad treba da ubacim podkategorije. Output bi trebalo da bude u stilu
------------------
Kategorija_1
pokategorija_1, podkategorija_2
(ukupno xx članaka u svim zbirnim podkategorijama)

Kategorija_2
podkategorija....
(...)
-----------------

Ja ne bih uvodio tabelu podkategorije, već bih išao na varijantu parent_category_id polja u tabeli kategorija.

Ono što mi je problem je kako da modifikujem gornji query da bih dobio output kakav želim uz što manju modifikaciju koda? pokušao sam da u osnovni query ubacim nešto tipa (...) WHERE parent_category_id = '$current_cat_id' (...), pa da u rekurzivnoj f-ji iteriram kroz sve "glavne" kategorije prosleđujući $current_cat_id, ali sam zabrljao... ne znam kako da dobijem mysql_query oblika koji zelim (cat_1, sub_1_1, sub_1_2, cat_2, sub_2_1, cat_3, sub_3_1, etc...)

jel ima neko nekakvo elegantno rešenje za ovo, da ne uvodim novu tabelu?

thx
[ noviKorisnik @ 20.02.2004. 10:13 ] @
Samo dodaj to polje "parent_category_id" u tabelu i dodaj da se traži u selektu:

SELECT c.category, c.id, c.parent_category_id, COUNT(a.id) AS ArticleNumber...

i eventualno ga daš kao kriterijum sortiranja:

... ORDER BY c.parent_category_id, c.id

Priprema podataka za ispis na način koji želiš možda nije baš linearna ali ne deluje ni neizvodljivo.

Sve se utrpa u višedimenzionalni niz
Code:
$q = mysql_query ("SELECT ...");
$arrr = array ();

while ($r = mysql_fetch_assoc ($q))
{
  $parent_id = $r ['parent_category_id'];
  unset ($r ['parent_category_id']);
  if (!array_key_exists ($parent_id, $arrr))
    $arrr [$parent_id] = array ();
  array_push ($arrr [$parent_id], $r);
}

... i tu je jedna lepa rekurzija
Code:
function lepa ($parent_id)
{
  if (!array_key_exists ($parent_id, $GLOBALS ['arrr']))
    return false;
  $cat_list = '';
  $number = 0;
  foreach ($GLOBALS ['arr'] [$parent_id] as $cat)
  {
    $cat_list .= ($cat_list != '' ? ', ' : '') . $cat ['category'];
    $number += $cat ['ArticleNumber'];
    $subcat = lepa ($cat ['id']);
    if ($subcat !== false)
    {
      $cat_list .= " ({$subcat['cat_list']})";
      $number += $subcat ['number'];
    }
  }
  return compact ('cat_list', 'number');
}

Ako korenske kategorije imaju "parent_category_id" jednaku nuli
Code:

foreach ($arr [0] as $cat)
{
  echo "<p>{$cat['category']}<br />\r\n";
  $number = $cat ['ArticleNumber'];
  $subcat = lepa ($cat ['id']);
  if ($subcat !== false)
  {
    echo "{$subcat['cat_list']}<br />\r\n";
    $number += $subcat ['number'];
  }
  echo "(ukupno $number članaka)</p>\r\n";
}

[ boccio @ 20.02.2004. 17:28 ] @
da, to je to... :))))

svaka cast, puno si mi pomogao...samo mi jos reci na koju adresu da posaljem gajbu piva :)