mysql - 高级 MySQL ORDER BY 父序列,然后按子序列

标签 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

有人可以帮忙吗?提前致谢

最佳答案

虽然其他答案适用于固定数据,但如果序列的实际值不同,则它不起作用......例如将“服务”父(空实例)序列的序列从 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/

相关文章:

mysql - 在 Mysql 中创建逻辑 View 的查询应该是什么?

python - 用数组值替换 mysql insert 语句

php - 计算多个表中不同值的出现次数

php - 可能危险的文本输入处理

MySQL 数据库在终端上启动,但不在 XAMPP 上启动

c# - 如何向 MySql Connector/NET 添加自定义 SSL 验证

php - 如何使我的 HTML 表单查询同时适用于所有表单元素?

php - 创建水平条形图

php - PDO 只获取单行

python - 保持mysql连接的正确方法