在子元素之后对子元素进行排序

时间:2011-06-08 23:34:28

标签: sql

我正在尝试实现类别表。 简化的表格描述就像这样

id -- name -- parent_id

假设样本数据如

id - name - parent_id
1 test1  null
2 test2  null
3 test3  null
4 test4  1
5 test5  4
6 test6  2
7 test7  1

我正在努力想出一个 sql查询,它将按以下顺序返回记录集

id - name - parent_id
1 test1  null
4 test4  1
5 test5  4
7 test7  1
2 test2  null
6 test6  2
3 test3  null

基本上,子元素在其父元素之后返回。

-----------------------通过在代码中使用LINQ /递归来解决------------- ------------

不完全是一个sql解决方案,但最终还是有效。

4 个答案:

答案 0 :(得分:2)

根据您尝试对查询执行的操作,您无需按此方式对其进行排序。您只需要确保首先创建父项。因此,运行按父ID排序的查询,将结果放入数组并循环遍历该数组。在每次迭代时,进行检查以确保父项存在,如果它具有父项。如果父项不存在,只需将该项移动到数组的末尾并暂时转到下一项,您应该最终得到一些被移动的案例,以便保持相当高效。

答案 1 :(得分:1)

我过去一直在做的就是将数据库拆分成以下内容(虽然我不是最好的SQL,所以可能还有其他一些解决方案)。

categories
 - category_id  |  int(11)  | Primary Key / Auto_Increment
 ..
 ..

sub_categories
 - sub_category_id  |  int(11)  |  Primary Key / Auto_Increment
 - category_id      |  int(11)  |  Foreign Key to categories table
 ..
 ..

答案 2 :(得分:1)

下面的查询的工作原理是添加了一个额外的order_parent列,其中包含父ID或行的id,具体取决于它是否为父级。然后,它主要按order_parent ID进行排序,将它们组合在一起,然后通过parent_idnull s(实际父项)进行排序。

两件事:

  1. 这还有一个你原本想要的专栏,所以请忽略它。
  2. 如果您的数据库最后返回parent_id的nulls,请添加DESC
  3. 好的问题,顺便说一句!

    SELECT   id,
             name,
             parent_id,
             (
                 case
                 when parent_id is null then id
                 else parent_id
                 end
             ) AS order_parent
    FROM     myTable
    ORDER BY order_parent, parent_id
    

答案 3 :(得分:1)

以下是我要做的事情:

SELECT id, name, parent_id, (CASE WHEN COALESCE(parentid,0)=0 THEN id ELSE (parentid + '.' + id)) as orderid
FROM table
ORDER BY (CASE WHEN COALESCE(parentid,0)=0 THEN id ELSE (parentid + '.' + id))

这应该创建一个名为orderid的新列,其parentid点为id(1.4,4.5等)。对于父id为null的列,它只会放入id。通过这种方式,您可以获得1,1.4,4,4.5等的订单

请检查代码,因为我在未经测试的情况下即时编写了代码。它应该很接近。