说我有一张这样的表:
================================= | 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子句是棘手的部分。它只是从最高级别开始按层次结构的级别进行排序。
该版本的原始版本适用于问题中的数据。更广泛的测试发现它并不总是有效。我相信此版本始终有效。