我有一个像这样的 MySQL 表
+-----+-----------+----------+------------+
| uid | title | sequence | parent_uid |
+-----+-----------+----------+------------+
| 1 | Home | 1 | NULL |
| 2 | Services | 2 | NULL |
| 3 | Faq | 3 | NULL |
| 4 | Contact | 4 | NULL |
| 6 | Service A | 1 | 2 |
| 5 | Service B | 2 | 2 |
+-----+-----------+----------+------------+
仅使用一个 MySQL 查询,没有 MySQL 用户定义函数,没有使用 PHP 的服务器端处理,没有使用 JavaScript 的处理,这可能吗?如果是这样,最佳做法是什么?这是想要的结果
+-----+-----------+----------+------------+
| uid | title | sequence | parent_uid |
+-----+-----------+----------+------------+
| 1 | Home | 1 | NULL |
| 2 | Services | 2 | NULL |
| 6 | Service A | 1 | 2 |
| 5 | Service B | 2 | 2 |
| 3 | Faq | 3 | NULL |
| 4 | Contact | 4 | NULL |
+-----+-----------+----------+------------+
我的表类型是 MyIsam,因此解决方案存在局限性。
这里有几个答案,但我似乎无法根据我的序列字段进行排序。
SELECT p1.*
FROM page p1
LEFT JOIN page p2 ON p2.parent_uid = p1.uid
GROUP BY p1.uid
ORDER BY
CASE
WHEN p1.parent_uid IS NULL
THEN p1.sequence
ELSE p1.parent_uid
END,
p1.parent_uid
其他几个例子在这里: Ordering MySQL results to obey parent/child MySQL Tree ordered by parent and child
有人可以帮忙吗?提前致谢
最佳答案
虽然其他答案适用于固定数据,但如果序列的实际值不同,则它不起作用......例如将“服务”父(空实例)序列的序列从 2 更改为 5。
您确实需要按预期执行左连接,但您想要的是三重顺序...首先将所有内容按正确的父级分组,然后从每个父级开始,将父级保持在顶部位置,次要的所有子条目,最后是按顺序排列的所有子条目。
SELECT
t1.*
FROM
t t1
LEFT JOIN t t2
ON t1.parent_uid = t2.uid
ORDER BY
COALESCE( t2.sequence, t1.sequence ),
case when t2.uid IS NULL then 1 else 2 end,
t1.sequence
Revised option for SQLFiddle将服务显示为父项的 5 序列,然后是所有子项
关于mysql - 高级 MySQL ORDER BY 父序列,然后按子序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21257818/