说我有一张这样的表:
=================================
| ID | Parent_ID | Page_Name |
=================================
| 1 | NULL | Home |
| 2 | NULL | Services |
| 3 | 2 | Baking |
| 4 | 3 | Cakes |
| 5 | 3 | Bread |
| 6 | 5 | Flat Bread |
---------------------------------
如何才能以这种格式对结果进行实际排序?即由父级->子级->子子级命令,根据我只要求说最多5个级别?我已经研究了“嵌套集模型”,但是对于我的要求而言,它似乎太复杂了。我不确定的是真正理解了可用于显示如上所示结果的SQL查询,或者在这种情况下,我应该使用像PHP这样的服务器端语言来帮我吗?
您可以尝试以下方法:
select t.*,
(case when t4.parent_id is not NULL then 5
when t4.id is not null then 4
when t3.id is not null then 3
when t2.id is not null then 2
when t1.id is not null then 1
else 0
end) as level
from t left outer join
t t1
on t.parent_id = t1.id left outer join
t t2
on t1.parent_id = t2.id left outer join
t t3
on t2.parent_id = t3.id left outer join
t t4
on t3.parent_id = t4.id
order by coalesce(t4.parent_id, t4.id, t3.id, t2.id, t1.id, t.id),
coalesce(t4.id, t3.id, t2.id, t1.id, t.id),
coalesce(t3.id, t2.id, t1.id, t.id),
coalesce(t1.id, t.id),
t.id
如果层次结构是有限的,则不需要递归查询。
order by子句是棘手的部分。它只是从最高级别开始按层次结构的级别进行排序。
该版本的原始版本适用于问题中的数据。更广泛的测试发现它并不总是有效。我相信此版本始终有效。