我有一个像这样的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
有人可以协助吗?提前致谢
答案 0 :(得分:3)
虽然另一个答案适用于固定数据,但如果序列的实际值不同,则它不起作用...例如将“服务”父(空实例)序列的序列从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,然后是所有子条目