我有一个数据库,其中的项目被分类。其中一些类别是嵌套的,例如:
Animals > Birds > Parrots
Animals > Birds > Penguin
Animals > Mammals > Cats
Animals > Mammals > Dogs
Animals > Reptiles > Snakes
Plants > Trees
Plants > Flowers
等
我在
的表格中有这些CATEGORY PARENT
Animals -
Birds Animals
Penguin Birds
等
我希望能够从起点说起动物并列出所有子类别,因此对于动物我们会列出鸟类,哺乳动物,爬行动物,鹦鹉,企鹅,猫,DOgs ,蛇
单个查询是否可以实现?如果没有,我需要做什么
TIA
答案 0 :(得分:2)
通过遵循下面的“修改过的预订树遍历”一文,您可以放弃递归并使用单个查询来查找使用单个SQL查询的子计数,直接类别和子类别:
在google.com上搜索关键字“Modified Tree Traversal + Sitepoint”,阅读sitepoint.com上解释相同模式的文章。
答案 1 :(得分:1)
如果向架构中添加一些层次结构元数据,则可以通过单个查询执行此操作。
将两个整数列(start
和end
)添加到类别表中。然后对树进行深度优先遍历,在每一步增加一个计数器,并在进入节点时将计数器值分配给start
,并在离开时将其分配给end
(即当它的所有子代都已处理时) 。
因此,对于您的示例,显示的值为(start,end)
:
Animals (1,18)
Birds (2,7)
Parrots (3,6 )
Penguin (4,5)
Mammals (8,13)
Cats (9,12)
Dogs (10,11)
Reptiles (14,17)
Snakes (15,16)
Plants (19,24)
Trees (20,23)
Flowers (21,22)
现在选择获取动物和它的孩子,你可以运行像这样的查询:
SELECT * FROM Category where start >=1 and start < 18
当层次结构更改与读取查询的效率相比时,您显然已经权衡了重建元数据的成本。对于相对静态的层次结构,这种技术运作得相当好。
答案 2 :(得分:0)
SQL在遍历分层数据方面非常糟糕。
我会对此进行编程并递归或迭代地找到所有孩子。
以下伪代码应该有效(如果数据中没有循环)
如果层次结构中存在循环,则必须确保不附加已存在于数组中的子项,否则循环将消耗所有内存并崩溃
答案 3 :(得分:0)
我不太了解获取数据的mysql过程,但我们可以在PHP的帮助下使用单个mysql查询获取嵌套数据,您可以对任何语言使用相同的逻辑。
http://www.maheshchari.com/php-nested-categories-with-single-mysql-query/