我有两张table;类别和产品。对于每一个类别,我想计算其所有子类别中有多少产品。我已经数过每个类别有多少。示例表如下:
类别:
ID ParentID ProductCount SubCategoryProducts
1 NULL 0
2 1 2
3 2 1
产品:
ProductID CategoryID
123 2
124 2
125 3
所以我希望我的函数:
ID ParentID ProductCount SubCategoryProducts
1 NULL 0 3
2 1 2 1
3 2 1 0
它只需要作为一个选择查询,无需更新数据库。
有什么想法吗?
编辑:SQL文件:http://sqlfiddle.com/#!1941a/4/0年2月
4条答案
按热度按时间wtlkbnrh1#
如果是我,我会创建一个存储过程。另一种选择是使用PHP循环第一个查询,然后对每个ID运行另一个查询-但这种逻辑会大大降低页面速度。
下面是一个关于存储过程的很好的教程:http://net.tutsplus.com/tutorials/an-introduction-to-stored-procedures/
基本上,您可以运行与前面提到的PHP相同的循环(但它运行得更快)。该过程存储在数据库中,可以像函数一样调用。结果与查询相同。
根据请求,这里有一个示例过程(或者更确切地说,它使用了两个)。在我的示例中,“ags_orgs”的行为与您的类别类似,其中有parentOrgID。“getChildOrgs”的作用也有点像一个冗余函数,因为我不知道我必须降多少级(这是为MSSQL编写的,可能与mySQL有区别)不幸的是,它不计算行数,而是获取数据。我强烈建议遵循一两个教程,更好地掌握它的工作原理:
此进程调用:
vfwfrxfs2#
以下是我计算所有子类别产品的程序
要调用过程,只需运行:
其中参数为:
firstLoop-第一个循环始终为“1”
parentId-子类别的父级
updateId-要更新的行id,第一个循环始终为“0”
例如:
我希望这个例子对某人有用。
3gtaxfhh3#
这假设您有名为prods的Product表
和名为categ的类别表
由于您似乎正在使用Adjacency List结构,其中外键parent_categ_id列引用同一表中的prod_id列,因此以下查询应该可以工作
r7s23pms4#
如果对层次结构的深度有限制,则可以在一个语句中完成此操作。你说你总共只有4级。
如果您以当前的方式存储层次结构,这将适用于此查询,即所谓的“邻接列表”。基本上,
ParentID
是每个节点记录其在层次结构中的位置的方式。还有其他几种存储层次结构的方法,可以更容易地查询整个树或子树。最佳的数据组织取决于要运行的查询。
以下是更多的资源: