ugrás a tartalomhoz

SQL kategóriák elemszámának lekérdezése

Tanul0 · 2011. Ápr. 20. (Sze), 10.58
Üdvözletem!

Adott az alábbi sql kérés:

SELECT `Category`.`id`, `Category`.`parent_id`, `Category`.`name`, `Category`.`about`,
     (SELECT COUNT(*) FROM products as Products WHERE 
      `Category`.`id`=`Products`.`category_id`) AS 
      `Category__count_products` FROM `categories` AS
      `Category` WHERE `Category`.`parent_id` = 3
Nos, ebben a lekérdezéssel csak az adott kategóriához tartoró termékeket számát kapom meg. Mivel a kategória egy fa, tehát lehet több gyermeke egy adott kategóriának, és nem tartozik mindegyikhez termék. Amiben segítségre lenne szükségem a következő:

A fő kategóriához meg szeretném kapni az összes gyermekhez tartozó termék számát. Pl.:

Hentesáru (6)
---Felvágottak (4)
------Szalámi(2)
-----------Pick
-----------Rákóczi
------Párizsi(2)
-----------Pulkya
-----------Sertés
---Füstölt húsok (2)
------Csülök
------Köröm

Nem tudom, hogy egyáltalán megvalósítható-e ez sql kéréssel, ha igen milyen módon?

Üdv!
 
1

Dinamikus mélység

vbence · 2011. Ápr. 20. (Sze), 11.18
Mivel annyi join kell, ahány szintű a fastruktúrád mindenképpen dinamikusan kell összeraknod a queryt. Ehhez vagy megállapítassz egy maximum mélységet, amit uténa betartasz, vagy lekéred a kategória tábládat és PHP-ben végignyomozod.

Meg persze megoldható tárolt eljárással is a dolog.
4

Valószínüleg az utóbbi lesz.

Tanul0 · 2011. Ápr. 20. (Sze), 12.29
Valószínüleg az utóbbi lesz.
2

Hierarchikus?

janoszen · 2011. Ápr. 20. (Sze), 11.20
Itt a Weblaboron volt két cikk a hierarchikus adatkezelésről, valamint a blogomon volt egy cikk a gyakorlati implementációról. Esetleg fontold meg, hogy érdemes-e használni.

Attól függetlenül, hogy milyen implementációt választasz azt javaslom, hogy a szükséges SQL query bonyolultsága miatt mentéskor számold ki, hogy hány gyerek van és írd bele az adatbázisba. Ez ugyan ellent mond a normalizáció elvének, de nem fog berohadni a szervered, ha valaki megkerget egy auto reloaderrel.
3

Nos, a tömböt így építem fel,

Tanul0 · 2011. Ápr. 20. (Sze), 12.24
Nos, a tömböt így építem fel, nem tudom mennyire számít ez hierarchikusnak, ez egy navigációs menü lesz.

	function getCategoryTree($id=0){
		$items = $this->getCategoryChildren($id);
		$result =array();
		if(is_array($items))
			foreach($items as $item){
				$result[$item["id"]] = $item;
				if($children = $this->getCategoryTree($item["id"]))
				$result[$item["id"]]["Children"] =$children;
			}
		return $result;
	}
	function getCategoryChildren($id){
		$result = false;
		$items = $this->find('all', array('conditions' => array('Category.parent_id' => $id)));
		foreach($items as $item){
			$result[$item["Category"]["id"]] = $item["Category"];
		}
		return $result;
	}
Lehet, hogy hanyagolni fogom, mert nem ér annyit az egész, írok rá egy feltételt, hogy ha nem tartozik hozzá termék akkor ne írja ki, vagy view oldalon írok rá egy külön függvényt, amely a tömbben lévő count_products indexhez értékeket értékeket összeadja. Mindenesetre mindenképpen átrágom a cikkeket, amiket linkeltél. Ha megcsinálom, mindenképp beírom a megoldását.

ui: Csak nekem nagyon lassú a weblabor?
5

Olvasd el

janoszen · 2011. Ápr. 20. (Sze), 13.03
Szerintem, olvasd el, amit belinkeltem. :) A felvázolt módszerrel gyk. minden kategórira egy select-tel meg lehet mondani, hány levél típusú elem van a fában, ha ügyes vagy. Innentől gyerekjáték az egész.
7

Mindenképpen át fogom rágni,

Tanul0 · 2011. Ápr. 20. (Sze), 14.33
Mindenképpen át fogom rágni, csak egyelőre átfuni és éppen hogy volt időm.
6

Ha jól értelmezem, a

vbence · 2011. Ápr. 20. (Sze), 13.33
Ha jól értelmezem, a $this->find egy SQL lekérdezést futtat. Ezesetben száz körmös és kukorica térdepelés jár a ciklusban (és rekurzióban) futtatott querykért.
8

A nyitótémában lévő queryt

Tanul0 · 2011. Ápr. 20. (Sze), 14.35
A nyitótémában lévő queryt futtatja, kb 1000, 1500 termék lesz 100-150 kategóriába foglalva. Még nem csináltam ilyet, le akarom tesztelni mennyire terhel. De majd a fentebb linkelt cikkeket átrágom.