我有以下查询:
SELECT
p.CategoryID
,p.Category_Name
,p.IsParent
,p.ParentID
,p.Sort_Order
,p.Active
,p.CategoryID AS sequence
FROM tbl_Category p
WHERE p.IsParent = 1
UNION
SELECT
c.CategoryID
,' - ' + c.Category_Name AS Category_Name
,c.IsParent
,c.ParentID
,c.Sort_Order
,c.Active
,c.ParentID as sequence
FROM tbl_Category c
WHERE c.IsParent = 0
ORDER BY sequence, ParentID, Sort_Order
这导致:
Parent
- child
Parent
- child
- child
等
我遇到的困难是让结果服从Sort_Order,以便父母处于正确的排序顺序,并且这些父母下的孩子处于正确的排序顺序。现在它正在根据父类别的ID进行排序。
不确定高级分组或如何处理它。非常感谢任何帮助。
答案 0 :(得分:1)
我就是这样做的,假设父子关系代表的树只有两层深。
SELECT *
FROM
(
SELECT p.CategoryID
, p.Category_Name
, p.IsParent
, p.ParentID
, p.Active
, p.Sort_Order as Primary_Sort_Order
, NULL as Secondary_Sort_Order
FROM tbl_Category p
WHERE p.IsParent = 1
UNION
SELECT c.CategoryID
, ' - ' + c.Category_Name AS Category_Name
, c.IsParent
, c.ParentID
, c.Active
, a.Sort_Order as Primary_Sort_Order
, c.Sort_Order as Secondary_Sort_Order
FROM tbl_Category c
JOIN tbl_Category a on c.ParentID = a.CategoryID
WHERE c.IsParent = 0
AND a.IsParent = 1
) x
ORDER BY Primary_Sort_Order ASC
, (CASE WHEN Secondary_Sort_Order IS NULL THEN 0 ELSE 1 END) ASC
, Secondary_Sort_Order ASC
Primary_Sort_Order首先将父母及其子女作为一组进行排序。然后在主要组内,强制使用Secondary_Sort_Order的NULL值,然后按Secondary_Sort_Order的常规非NULL值进行排序。
答案 1 :(得分:1)
经过大量搜索,我为此类问题提供了解决方案,它可以解决您的问题。 在这里,我还有另一个排序顺序列,用于选择与其父记录相同的排序顺序。使用此二级SortOrder首先对记录进行排序,然后将子记录分组在Parent
下CASE WHEN ParentID = 0 THEN CategoryID ELSE ParentID END,
CASE WHEN ParentID = 0 THEN 0 ELSE Primary_Sort_Order END,
这用于将其父字段下的子字段分组。
最终解决方案如
SELECT * FROM
(
SELECT p.CategoryID
, p.Category_Name
, p.IsParent
, p.ParentID
, p.Active
, p.Sort_Order AS Primary_Sort_Order
, CASE WHEN p.IsParent = 0 THEN (SELECT Sort_Order FROM tbl_Category WHERE
CategoryID = p.ParentID) ELSE p.Sort_Order END AS Secondary_Sort_Order
FROM tbl_Category p
) x
ORDER BY Secondary_Sort_Order,
CASE WHEN ParentID = 0 THEN CategoryID ELSE ParentID END,
CASE WHEN ParentID = 0 THEN 0 ELSE Primary_Sort_Order END,
Primary_Sort_Order ASC
希望有帮助...!
答案 2 :(得分:0)
如果我正确理解了问题,您希望通过2个不同的索引对数据进行排序:
1.对于父母
2.对于孩子们
假设我这样做,我会尝试将ORDER BY子句更改为:
ORDER BY
CASE WHEN p.IsParent = 1 THEN CATEGORY NAME ELSE PARENT NAME END,
p.IsParent
这有点粗糙,因为我不知道数据是什么样的 如果您添加一些示例数据,我将尝试制作一个有效的示例。
<强> ===编辑=== 强>
如果我假设以下(简化)数据:
╔═══════════════════════╗
║ ID Parent_ID IsParent ║
╠═══════════════════════╣
║ 1 0 1 ║
║ 2 5 0 ║
║ 3 5 0 ║
║ 4 1 0 ║
║ 5 0 1 ║
║ 6 5 0 ║
╚═══════════════════════╝
我希望以下输出顺序:
-1
-4
-5
-2
-3
-6
为了做到这一点,您需要在ORDER BY
时ID
列IsParent = 1
和ParentID
时IsParent = 0
列{}
您可以使用二级订单按ID订购子项。
希望这能为你解决一些问题。