如何查询子关系到同一个表并正确排序

时间:2010-05-04 08:36:26

标签: sql mysql

拿这张桌子:

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)上,但子行必须直接显示在其父级下。

谢谢。

3 个答案:

答案 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功能的东西