如何通过父母和孩子订购?

Evi*_*mes 12 sql t-sql

我试图编写我的SQL Server 2008查询,以便我可以根据需要循环我的输出和输出标头.我已经多次以错误的方式完成了这些工作并让ColdFusion在页面内做了很多工作,但需要在SQL Server中完成.

FeatureID ParentID Feature
--------------------------
1         0        Apple      
2         0        Boy 
3         2        Charles
4         1        Daddy
5         2        Envelope
6         1        Frankfurter
Run Code Online (Sandbox Code Playgroud)

我希望我的查询结果集看起来像这样:

FeatureID ParentID Feature
--------------------------
1         0        Apple      
4         1        Daddy
6         1        Frankfurter
2         0        Boy 
3         2        Charles
5         2        Envelope
Run Code Online (Sandbox Code Playgroud)

如果ParentID为0,则表示它是主要类别.如果ParentID大于0,则表示它是次要类别,父级的子级.

所以父母需要订购A - Z,孩子需要订购AZ.

你能帮我订一下吗?

SELECT FeatureID, ParentID, Feature
FROM Features
ORDER BY
Run Code Online (Sandbox Code Playgroud)

And*_*mar 12

从您的评论中,如果您知道只有两个级别,那么有一个简单的解决方案:

select  *
from    @Features feat
order by
        case 
        when ParentID = 0 
        then Feature 
        else    (
                select  Feature 
                from    @Features parent 
                where   parent.FeatureID = feat.ParentID
                ) 
        end
,       case when ParentID = 0 then 1 end desc
,       Feature
Run Code Online (Sandbox Code Playgroud)
  1. 按根元素的名称排序:对于根,这是Feature列.对于孩子,使用子查询查找根名称.
  2. 在根上排序根
  3. 按名称对子项进行排序

SE数据示例.


You*_* Qi 8

对于mysql,您可以尝试:(条件是您​​的Child的ParentID是您的ParentID的FeatureID)

SELECT FeatureID, ParentID, Feature
FROM Features
ORDER BY case when ParentID=0 then FeatureID else ParentID end * 1000 + FeatureID ASC
Run Code Online (Sandbox Code Playgroud)

  • 这不应该只是`ORDER BY CASE WHEN ParentID=0 THEN FeatureID ELSE ParentID END ASC, FeatureID ASC`吗?因为那样它仍然会使用索引,并且它不会被限制为 999 条记录。但是是的,如果你有 `(7, 8, 'bar')` 和 `(8, 0, 'foo')`,(`SELECT COUNT(1) FROM Features WHERE FeatureID < ParentID`) must = 0 . 意味着一个项目的 FeatureID 永远不能小于它的父项。 (2认同)