拿这张桌子:
id name sub_id
---------------------------
1 A (null)
2 B (null)
3 A2 1
4 A3 1
sub_id列是他自己的表与列ID的关系。
subid --- 0:1 --- id
现在我有一个问题是创建一个正确的SELECT查询,以显示在其父行下直接选择子行(sub_id不为null)。所以这必须是正确的顺序:
1 A (null)
3 A2 1
4 A3 1
2 B (null)
正常的SELECT命令id。但是,如何或哪个关键字帮助我正确订购?
我认为JOIN是不可能的,因为我希望将所有行分开。因为行将显示在带有EntityDataSource的Gridview(ASP.Net)上,但子行必须直接显示在其父级下。
谢谢。
答案 0 :(得分:5)
请看Managing Hierarchical Data in MySQL。
由于递归是一项昂贵的操作,因为基本上你要向数据库发出多个查询,你可以考虑使用嵌套集模型。简而言之,您将数字分配给表格中的范围。这是一篇很长的文章,但值得一读。我在实习期间使用它作为一个解决方案,不要有1000多个查询,但将其归结为1个查询。
您的处理“开销”现在就在于通过添加,更新或删除记录来更新表。因为您必须使用更大的“正确值”更新所有记录。但是当你检索数据时,一切都是1查询:)
答案 1 :(得分:1)
select * from table1 order by name, sub_id
将返回您想要的结果,但仅仅因为父母姓名和子姓名相似。如果您正在使用SQL 2005,则递归CTE将起作用:
WITH recurse (id, Name, childID, Depth)
AS
(
SELECT id, Name, ISNULL(childID, id) as id, 0 AS Depth
FROM table1 where childid is null
UNION ALL
SELECT table1.id, table1.Name, table1.childID, recurse.Depth + 1 AS Depth FROM table1
JOIN recurse ON table1.childid = recurse.id
)
SELECT * FROM recurse order by childid, depth
答案 2 :(得分:0)
选择 * 从 表 订购 COALESCE(id,sub_id),id
顺便说一下,这只适用于一个级别..任何比这更需要递归/ cte功能的东西