Autor Zpráva
Jack06
Profil
Dobrý den dnes jsem viděl tabulku s kategoriema a podkategoriema v jednom. Byla tvořena asi takto:

ID | Název kategorie/podkategorie | ID kategorie
01 | Kategoriex | 0
02 | Kategoriey | 0
03 | Podkategoriex | 1
04 | Podkategoriey | 1
...


ID Kategorie - číslo pod kterou kategorii spadá když je číslo 0 tak je to Název kategorie, když je jiné od nuly tak se přiřazuje k jedinečnému identifikátoru dané kategorie

tadyten řetězec tedy vypadá takto

Kategoriex
-- Podkategoriex
-- Podkategoriey
Kategoriey

Je lepší to dělat tímto způsobem, nebo přez dvě tabulky:
ID | Název kategorie

---------------------------------------

ID | Název podkategorie | ID kategorie

?? Děkuji za radu, či lepší řešení.
Alphard
Profil
Výhoda první možnosti je hlavně v tom, že můžete zanořovat do neomezené hloubky. Konkrétně tohle řešení se ale vypisuje rekurzivně a to není moc efektivní, zkuste se podívat i na jiné algoritmy.
Metody ukládání stromových dat v relačních databázích | Interval.cz
Jack06
Profil
Mno mě jde o to že budu mít:
 kategorii
  - podkategorii
      -zařazený výrobek
  - nazařazené výrobky 

a pak výrobky (když se někomu nebude hodit podkategorie, tak by dal výrobek jen do kategorie)
Tak hledám, jaké řešení bude nejlepší a tak trochu si nevím rady.
Hledám co nejmenší nápor na databázi při vypisování stromu včetně výrobků, přičemž podle mě by bylo lepší minimálně na výrobky mít samostatnou databázi. Asiže z toho co jste mi poslal tak ačkoli ne nejméně zátěžové, ale nejlepší práce by byla s metodou zásobníku.

Výsledkem, který potřebuji je pouze strom:
Kategorie (počet výrobků)
  - podkategorie(počet výrobků)
  - podkategorie(počet výrobků)
atd
Alphard
Profil
Jack06:
přičemž podle mě by bylo lepší minimálně na výrobky mít samostatnou databázi
Určitě, ale stačila by samostatná tabulka (asi jste to tak myslel).

ale nejlepší práce by byla s metodou zásobníku.
Tím neušetříte dotazy na databázi. Jestli je počet kategorií malý, můžete vše načíst jedním dotazem do pole a z něho rekurzivně poskládat. Jinak bych šel do Traverzování kolem stromu.
Jack06
Profil
Alphard:
Kategorií bude tak 10-20 a v každé kategorii kolem 10 podkategorií zbytek už jen výrobky zařazené buď přímo do podkategorií, nebo jen do kategorie
Jack06
Profil
Omlouvám se, že sem píšu znovu, nicméně jsem se pokoušel nějak rozjet tu rekurzivní třídu a nejde mi to :-(

Tabulka v mysql je:
CREATE TABLE category (
  id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  parent_id INT(10) UNSIGNED NOT NULL,
  title VARCHAR(50) NOT NULL,
  seo_title VARCHAR(50) NOT NULL,
  meta_keywords VARCHAR(250) NOT NULL,
  meta_description VARCHAR(250) NOT NULL,
  description TEXT NOT NULL,
  created DATETIME NOT NULL,
  PRIMARY KEY(id),
  INDEX category_parent(parent_id),
  INDEX category_title(title)
);



a tu třídu jsem zkoušel tuto:
<?php
Class TreeCat 
{ 
  var $id = 0; 
  var $name =''; 
  var $level = 0; 
  var $childNodes = array(); 
  function TreeCat($id, $name, $level){ 
    $this->id=$id; $this->name=$name; $this->level=$level; 
    $this->db = MyDB::getDB(); $this->db->set_charset('utf8');
    $re = $this->db->query("SELECT id, title FROM category where (parent_id=$id)"); 
     while ($r = $re->fetch_assoc()) { 
      $this->childNodes[] = new TreeCat($r['id'], $r['title'], $level++); 
    }
    print $childNodes;
  } 
}
?>


buď mi to naháže errory, že $id atd neexistují, nebo mi to nic nevypíše a nějak nevím jak to udělat, aby se mi vypsal ten strom :-(

Děkuji za rady
_es
Profil
Jack06:
Kategorií bude tak 10-20 a v každé kategorii kolem 10 podkategorií zbytek už jen výrobky zařazené buď přímo do podkategorií, nebo jen do kategorie

Tak to potom sprav nejako jednoducho, ak má byť výrobok len v jednej kategórii, napríklad:
Tabuľka kategórií a podkategórií:
Id | Názov | Id nadradenej kategórie

Tabuľka výrobkov:
Id | Názov | Id kategórie alebo podkategórie


Ak by mohol byť výrobok aj vo viacerých kategóriách alebo podkategóriách, tak to bude asi najlepšie ešte s tabuľkou naviac.
A stačia ti na to len SQL dotazy a netreba žiadne rekurzívne algoritmy v PHP.
Jack06
Profil
_es:
To ano, ale k té první tabulce potřebuju vypsat ten strom

kategorie
-podkategorie
-podkategorie
-podkategorie
-podkategorie
-podkategorie
kategorie_b
-podkategorie_b
-podkategorie_b
-podkategorie_b
-podkategorie_b
-podkategorie_b

s těma dvěma tabulkama samozřejmě počítám, akorád jestli to mám teda udělat takto:
<?php
    $ca = $this->db->query("SELECT id, title FROM category where (parent_id=0)"); 
     while ($c = $ca->fetch_assoc()) {
     print "$p[title]<br>"; 
     $po = $this->db->query("SELECT title, title FROM category where (parent_id=$c[id])"); 
     while ($p = $po->fetch_assoc()) { print " => $p[title]<br>"; }
     }
?>


? Zdá se mi to moc dotazů k mysql, proto jsem hledal lepší řešení ohledně třídy, která by vytáhla ty data jednou a seředila si je do toho stromu
_es
Profil
Jack06:
Na ten strom by ti mal tiež stačiť SQL dotaz:
Ak budú stĺpce id, nazov, idN, idN2:
SELECT nazov FROM category ORDER BY idN2, idN, id

Stĺpec idN2 je taký istý ako idN, až na to, že pre hlavné kategórie je rovnaký ako id.
Ešte ti zostáva nejako doplniť to formátovanie pre podkategórie.
Možno by to šlo aj bez stĺpca naviac, no či by bol potom ten SQL dotaz taký jednoduchý...
Jack06
Profil
_es:
Tak trochu to enchápu to idN2, IdN, id

Přeciže by to snad muselo jít lépe ne? Myslím například na to sepsat nějakou funkci v php, která by si ty záznamy řešila :-)
_es
Profil
Jack06:
Načo chceš silou mocou používať PHP na zoraďovanie riadkov v databáze?
Na to je predsa priamo databáza a ty si ju musíš navrhnúť tak, aby ti na takéto jednoduché zoraďovanie stačili SQL dotazy.

Přeciže by to snad muselo jít lépe ne?
Asi áno, no nie nejakými PHP funkciami.
Len som sa ťa snažil postrčiť iným smerom.
Jack06
Profil
_es:
mohl by jsi mi dát třeba příklad s těmi idN2, IdN, id jak by to vypadalo v tabulce a jak se to vypsalo? protože to nějak moc nechápu jak si to udělá samo strom kategorie a pak s odrážkou podkategorie, abych to jako uživatel viděl na obrazovce
_es
Profil
Jack06:
Napríklad:
SELECT CONCAT(IF(idN=0, "", "-"), nazov) AS nazov FROM category ORDER BY idN2, idN, id

V tabuľke by si mal napríklad:
1, 'k1',  0, 1
2, 'pk1', 1, 1
3, 'pk2', 1, 1
4, 'k2',  0, 4
5, 'pk3', 4, 4

Možno to pôjde jednoduchšie alebo lepšie, no napadlo ma len toto.

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:

0