我正在尝试实现类别表。 简化的表格描述就像这样
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解决方案,但最终还是有效。
答案 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_id
对null
s(实际父项)进行排序。
两件事:
nulls
,请添加DESC
。好的问题,顺便说一句!
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等的订单
请检查代码,因为我在未经测试的情况下即时编写了代码。它应该很接近。