php - 使用父母和孩子对行进行排序
问题描述
我不确定这是否可以使用 MySQL,但让我们试一试。
像这样的表中有几行
UID - Name - Generation - ParentUID
1 - Parent1 - 1 - 0
3 - Parent2 - 1 - 0
7 - Parent4 - 1 - 0
14 - Child7 - 2 - 3
17 - Child8 - 2 - 3
20 - Parent8 - 1 - 0
55 - Child9 - 2 - 7
75 - Child12 - 3 - 55
90 - Child40 - 3 - 17
95 - Child20 - 2 - 7
等等......现在我想这样排序。如果 ParentUID 不是 0,请将您自己置于您的父母之下。
因此,在这种情况下,它将是:
UID - Name - Generation - ParentUID
1 - Parent1 - 1 - 0
3 - Parent2 - 1 - 0
14 - Child7 - 2 - 3
17 - Child8 - 2 - 3
90 - Child40 - 3 - 17
7 - Parent4 - 1 - 0
55 - Child9 - 2 - 7
75 - Child12 - 3 - 55
95 - Child20 - 2 - 7
20 - Parent8 - 1 - 0
Child20 在 Child12 之后,因为 Child9 是 Child12 的父级。你可以说它看起来像一个文件夹结构。不仅是三代人,而且是五七代人。这可能吗,还是我应该获取所有数据,然后用一些 PHP 魔法对其进行排序?
解决方案
您想首先对记录深度进行排序,从左到右。一种常见的方法是遍历树以构建表示元素路径的排序列。在 MySQL 8.0 中,您可以使用递归 cte 执行此操作:
with recursive cte(uid, name, generation, parent_uid, path) as (
select t.*, cast(lpad(uid, 3, 0) as char(100)) from mytable t where parent_uid = 0
union all
select t.*, concat(c.path, '/', lpad(t.uid, 3, 0))
from cte c
inner join mytable t on t.parent_uid = c.uid
)
select * from cte order by path
uid | 姓名 | 一代| parent_uid | 小路 --: | :-------- | ---------: | ---------: | :---------- 1 | 家长1 | 1 | 0 | 001 3 | 家长2 | 1 | 0 | 003 14 | 儿童7 | 2 | 3 | 003/014 17 | 儿童8 | 2 | 3 | 003/017 90 | 儿童40 | 3 | 17 | 003/017/090 7 | 家长4 | 1 | 0 | 007 55 | 孩子9 | 2 | 7 | 007/055 75 | 儿童12 | 3 | 55 | 007/055/075 95 | 儿童20 | 2 | 7 | 007/095 20 | 家长8 | 1 | 0 | 020
推荐阅读
- elasticsearch - 如何在 Kibana 中显示包含所有子项的 x 值总和的表格
- artifactory - 神器。如何通过本机浏览器禁用访问
- java - Firebase 回调接口需要声明为 final 吗?
- python - python selenium 无法处理具有两个文本输入的警报弹出窗口
- javascript - 定期检查中文标点,开发模式返回true,发布返回false
- php - {inheritdoc} 的需求是什么?
- linux - 如何在 u-boot 和 linux 用户空间之间使用 crc 验证环境变量?
- angular - 打开包含 Mat-Table 的 Angular Material 对话框会导致对话框显示没有任何内容
- debugging - 在调试模式下处理异常时 Windows 挂起
- c# - Unity3D PlayableDirector 向后播放时间线动画