简化示例:
我有一个名为things
的SQL表。事情本身有id
和name
。事物是树的一部分,例如一件事可以有一个父母;究竟如何存储并不重要,但重要的是可以从根节点到当前事物获取事物ID列表。
我有另一张名为properties
的桌子。属性包含thing_id
列,name
列和value
列。
我现在想要获取所有属性,按thing_id排序,按照从根目录到当前事物的路径的顺序。
例如,如果当前事物嵌套如下:Root(1) > Vehicle(4) > Car(2) > Hybrid(3)
,我希望首先返回属性列表,其中包含thing_id==1
的属性,然后是{{1}的属性},然后是thing_id == 4
,最后是thing_id==2
。
如何使用SQL完成此操作? (不使用N + 1选择)
答案 0 :(得分:1)
在SQL中,这可以通过使用递归查询来实现。这是一个例子
DECLARE @item as varchar(10)
with CTE (main_part, sub_part, NestingLevel)
as
(
select main_part, sub_part, 1 from tblParts
where main_part = @item
union all
select tblParts.main_part, tblParts.sub_part, (NestingLevel + 1) from tblParts
inner join CTE on tblParts.main_part = CTE.sub_part
)
select * from CTE
为了在MySQL中解决这个问题,您可以尝试临时表方法。以下是一个很好的例子:How to do the Recursive SELECT query in MySQL?