如何通过 MySQL 中的两个参数对分层 Table 进行排序?

How To Order A Hierarchical Table By Two Parameters In MySQL?

我有一个 table,里面有一些分层数据。我已经通过使用触发器计算路径以分层方式处理了它的排序,但现在我也想用另一个参数对它们进行排序。 看看这些图片:

这是 Table 具有按路径排序的分层数据:

我预计这两行会交换,因为第 ID = 4 行在第 ID = 2 行之前有一个日期:

那么如何按日期列对每个级别进行排序?

注意: ID是由触发器生成的随机数。

我认为您必须在每个级别的路径列中添加日期,因为您不能简单地按日期排序。

因此路径列应该如下所示:

0.date-2015-12-09 22:15:12.parent1.date-2015-12-09 22:15:14.parent4

0.date-2015-12-09 22:15:12.parent1.date-2015-12-09 22:15:17.parent2

在这种情况下,日期优先于父级别。 在这种情况下,1.4 会出现在 1.2 之前,因为 1.4 happend before 1.2

路径列确实有点冗长,但我认为这是您合并自己的层次结构的唯一方法

这次我收到了吗? :-) 希望我能帮上忙:-)

您可以使用FIND_IN_SET来提取每一行的层级。然后在 ORDER BY 子句中使用它:

SELECT ID, Name, ParentId, Date, Path
FROM mytable
ORDER BY FIND_IN_SET(ID, REPLACE(Path, '.', ',')), Date

注意:我们必须使用REPLACE函数将'.'个字符替换为',' 以便 FIND_IN_SET 按预期工作。

Demo here

或者,您可以修改触发器以生成额外的 'level' 字段,并在查询的 ORDER BY 子句中使用该字段。