php - 递归查询 SQL Server

  显示原文与译文双语对照的内容
0 0

我已经this了一段时间了。

我有一个名为Category的表,它看起来像这样:


number, name, parent
1, Fruit, null
2, Apples, 1
3, Golden Apples, 2
4, Pineapples, 1

现在,我如何选择主类别和它的子类别,如果它们存在,它们的子类别。

我必须像这样在PHP中输出:


<div>Fruit
 <div>Apples
 <div>Golden Apples</div>
 </div>
 <div>Pineapples</div>
</div>

理论上,没有已知的子类别或者子类别的数量。 我一直在纠结这个问题。

可以使用循环进行这里操作,然后再次运行查询,然后在数据库端重复资源。

我希望有人能帮助我。

时间: 原作者:

0 0

理想的方法是规范化数据。 有一个类别表和一个保存每个类别成员的表。 然后你可以在表之间做一个简单的LEFT JOIN 来得到你想要的。 因为你没有这个,所以你需要从主表中选择,然后使用别名在同一个表中执行 LEFT JOIN 。

像这样的东西会工作。

选择数字,从类别中选择父级为空 LEFT JOIN 类别,Items.Parent = Category.number 上的Items

0 0

尝试使用类似这样的递归 CTE:


--this is just an old example I've used before, but it kind of matches your table
--go through a nested table supervisor - user table and display the chain
DECLARE @Contacts table (id int, first_name varchar(10), reports_to_id int)
INSERT @Contacts VALUES (1,'Jerome', NULL ) -- tree is as follows:
INSERT @Contacts VALUES (2,'Joe', '1') -- 1-Jerome
INSERT @Contacts VALUES (3,'Paul', '2') --/
INSERT @Contacts VALUES (4,'Jack', '3') -- 2-Joe 9-Bill
INSERT @Contacts VALUES (5,'Daniel','3') --/ 
INSERT @Contacts VALUES (6,'David', '2') -- 3-Paul 6-David 10-Sam
INSERT @Contacts VALUES (7,'Ian', '6') --//
INSERT @Contacts VALUES (8,'Helen', '6') -- 4-Jack 5-Daniel 7-Ian 8-Helen
INSERT @Contacts VALUES (9,'Bill ', '1') --
INSERT @Contacts VALUES (10,'Sam', '9') --

DECLARE @Root_id int

--get complete tree---------------------------------------------------
SET @Root_id=null
PRINT '@Root_id='+COALESCE(''''+CONVERT(varchar(5),@Root_id)+'''','null')
;WITH StaffTree AS
(
 SELECT 
 c.id, c.first_name, c.reports_to_id, c.reports_to_id as Manager_id, cc.first_name AS Manager_first_name, 1 AS LevelOf
 FROM @Contacts c
 LEFT OUTER JOIN @Contacts cc ON c.reports_to_id=cc.id
 WHERE c.id=@Root_id OR (@Root_id IS NULL AND c.reports_to_id IS NULL)
 UNION ALL
 SELECT 
 s.id, s.first_name, s.reports_to_id, t.id, t.first_name, t.LevelOf+1
 FROM StaffTree t
 INNER JOIN @Contacts s ON t.id=s.reports_to_id
 WHERE s.reports_to_id=@Root_id OR @Root_id IS NULL OR t.LevelOf>1
)
SELECT * FROM StaffTree ORDER BY LevelOf,first_name

输出:


@Root_id=null
 id first_name reports_to_id Manager_id Manager_first_name LevelOf
----------- ---------- ------------- ----------- ------------------ -----------
 1 Jerome NULL NULL NULL 1
 9 Bill 1 1 Jerome 2
 2 Joe 1 1 Jerome 2
 6 David 2 2 Joe 3
 3 Paul 2 2 Joe 3
 10 Sam 9 9 Bill 3
 5 Daniel 3 3 Paul 4
 8 Helen 6 6 David 4
 7 Ian 6 6 David 4
 4 Jack 3 3 Paul 4

(10 row(s) affected)

我想你可以在PHP中循环搜索结果集并构建你的div 。

原作者:
...