mysql - Counting products associated with hierarchical category listing -
what have:
a table of categories listed hierarchically: 
a table of products. column category_id refers category.id: 
what trying do:
i trying design query count products of catogries withing specified lft , rgt values.
example: between lft = 2 , rgt = 11 there 3 "immediate subcategories" ids 3, 4 , 5. see wireless subcategory not included not immediate subcategory within range of lft , rgt products of subcategory counted part of immediate subcategory headphone can see picture below. headphone has 1 direct product , product relates wireless subcategory.
the result should be:

i have managed make query retrieves immediate sub-categories within specified lft , rgt values.
select node.name,node.id, (count(parent.name) - 1) depth category node, category parent node.lft between parent.lft , parent.rgt , parent.lft between {$lft} , {$rgt} group node.name having depth = 1 order node.lft this query retrieve sub-catogries in last picture when lft = 2 , rgt = 11 missing count.
i have experimenting table of results right quite while , came unfortunately not work reason not know. appreciate regarding this.
select parent.name, count(product.category_id) category node1 , product, ( select node.name,node.id,node.lft,node.rgt, (count(parent.name) - 1) depth category node, category parent node.lft between parent.lft , parent.rgt , parent.lft between {$lft} , {$rgt} group node.name having depth = 1 order node.lft ) parent node1.lft between parent.lft , parent.rgt , node1.id = product.category_id group parent.lft order parent.lft update: tried make sql fiddle got huge list of errors:
create table category ( id int auto_increment primary key, name varchar(20), lft varchar(20), rgt varchar(20) ); insert category (name, lft,rgt) values ('electronics','1','18'), ('tv & audio','2','11'), ('home theater','3','4'), ('blu-ray','5','6'), ('headphone','7','10'), ('wireless','8','9'), ('gaming','12','17'), ('game consoles','13','14'), ('video games','15','16'); create table product ( id int auto_increment primary key, name varchar(20), category_id varchar(20) ); insert product (category_id, name) values ('4','sony blu-ray player'), ('5','beats solo hd'), ('6','beats solo hd wireless'), ('8','playstation'), ('8','xbox');
could simple (?) like:
select category.name, coalesce(c.total,0) products category left join (select category_id, count(*) total product group category_id) c on c.category_id = category.id category.lft > @min_range , category.rgt < @max_range if ignore "noise", left join (to keep categories without products) between category table, , count of products each category.
using test case, produces:
+--------------+----------+ | name | products | +--------------+----------+ | home theater | 0 | | blu-ray | 1 | | headphone | 1 | | wireless | 1 | +--------------+----------+ 4 rows in set (0.00 sec) as see, produces result wireless not appears in expected result, according understanding of description of problem, should there.
Comments
Post a Comment