我正在显示一个目录树,在每个分支旁边,我想要一个相同级别或更低级别的列表数。
所有列表都有最低类别级别的catid。i、 e.如果有较低的类别级别可用,则不能将特定catid应用于列表。
例如,在下面的“listings”表中,您找不到catid=24的列表,因为这还不是该分支树中的最低级别。
在我的分类数据库中,最多有4个级别(0-3)。
以下是表格:
所有类别(表)
record_id parent_category_id parent_id title level
---------------------------------------------------------------------
24 NULL NULL Real Estate 0
5915 24 24 Residential 1
7569 5915 24 For sale 2
列表(表)
record_id cat_id
--------------------
1 7569
2 8847
因此,我的html分类树应该如下所示:
html格式
Categories Listing count
-------------------------------------
24 1
5915 1
7569 1
因此,在我的html和jquery代码中,我将任何级别的特定catid传递给查询,它应该找到处于或低于该级别的列表。
我已经试了好几个小时了,到目前为止我的努力还不值得炫耀。但无论如何我会的。。。
编辑:我到目前为止的努力(别笑了,试了几个小时不同的东西之后,我就糊涂了):
select l.record_id
from listings l
where catid in (
select record_id
from all_categories
where record_id = 5915)
or catid in (
select parent_category_id
from all_categories
where parent_category_id = 5915)
or catid in (
select parent_id
from all_categories
where parent_id = 5915)
6条答案
按热度按时间carvr3hs1#
在mysql 8中有一个(with)函数,它递归运行,您可以获得catid的级别
结构->(id cat parent \u id)->(1,24,null),(25915,1),(37569,2),(4,3,1)
唯一的限制是,这是在我的sql版本8.x休息的代码将运行良好的任何问题,你可以问这个方法叫cet希望它有帮助
qyyhg6bp2#
对于每个记录,左键联接子项,然后计算每个级别的唯一值并将它们相加。
yqkkidmi3#
你有一个神秘的数据结构,但问题似乎没有那么难。这似乎是你想要的:
这个想法很简单。table
all_categories
具有完整的层次结构。基本上,您需要将层次结构的所有级别移动到单独的行中,以便可以聚合它们。这就是
join
至c2
做。剩下的只是聚合。oxalkeyp4#
假设树的最大深度为四级,则可以使用多个左连接来检索完整树或子树。但这并不是超高效的。考虑以下查询:
它将产生如下结果:
不幸的是,它只包含完整路径。要匹配预期结果,只需将每行分成4行:
在db上演示
1qczuiv05#
子级的0级父级\u id保存在“all \u categories”表中。
所以一个孩子可以通过他们共同的父母id和其他孩子联系起来。
然后同时包含级别0。
困难在于给定的子id不在“listings”表中。
所以要检索列表记录的id,它必须经过类别。
rextester的测试可以在这里找到
结果:
“level”也包含在查询中,因为它可以用来生成html中的类别树。
请注意,如果“listings”表只包含级别0的catu id,那么查询可以简化很多
wko9yo5t6#
我相信这适合于递归sql。