【发布时间】:2015-09-20 23:40:06
【问题描述】:
我有一个表,其中包含一些分层数据。我已经通过使用触发器计算路径以分层方式对其进行排序,但现在我也想使用另一个参数对它们进行排序。 看看这些图片:
这是具有按路径排序的分层数据的表:
我希望这两行交换,因为行 ID = 4 在行 ID = 2 之前有一个日期:
那么如何按日期列对每个级别进行排序?
注意: ID 是由 TRIGGER 生成的随机数。
【问题讨论】:
我有一个表,其中包含一些分层数据。我已经通过使用触发器计算路径以分层方式对其进行排序,但现在我也想使用另一个参数对它们进行排序。 看看这些图片:
这是具有按路径排序的分层数据的表:
我希望这两行交换,因为行 ID = 4 在行 ID = 2 之前有一个日期:
那么如何按日期列对每个级别进行排序?
注意: ID 是由 TRIGGER 生成的随机数。
【问题讨论】:
您可以使用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 就可以按预期工作了。
或者,您可以修改触发器以生成额外的“级别”字段并在查询的ORDER BY 子句中使用此字段。
【讨论】:
FIND_IN_SET 部分吗?这如何解决问题?
SELECT 子句中包含 FIND_IN_SET(ID, REPLACE(Path, '.', ',')) 只是为了查看它为每一行返回的数字。
我认为您必须在每个级别的路径列中添加日期,因为您不能简单地按日期排序。
所以路径列应该如下所示:
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 发生在 1.2 之前
路径列确实有点长,但我认为这是您可以合并自己的层次结构的唯一方法
这次我收到了吗? :-) 希望我能帮上忙:-)
【讨论】: