高级MySQL ORDER BY父序列,然后是子序列

时间:2014-01-21 12:12:44

标签: mysql

我有一个像这样的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

有人可以协助吗?提前致谢

1 个答案:

答案 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,然后是所有子条目