【问题标题】:How To Order A Hierarchical Table By Two Parameters In MySQL?如何在 MySQL 中通过两个参数对层次表进行排序?
【发布时间】:2015-09-20 23:40:06
【问题描述】:

我有一个表,其中包含一些分层数据。我已经通过使用触发器计算路径以分层方式对其进行排序,但现在我也想使用另一个参数对它们进行排序。 看看这些图片:

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

我希望这两行交换,因为行 ID = 4 在行 ID = 2 之前有一个日期:

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

注意: ID 是由 TRIGGER 生成的随机数。

【问题讨论】:

    标签: mysql hierarchical-data


    【解决方案1】:

    您可以使用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

    或者,您可以修改触发器以生成额外的“级别”字段并在查询的ORDER BY 子句中使用此字段。

    【讨论】:

    • 救生解决方案。你能解释一下FIND_IN_SET 部分吗?这如何解决问题?
    • 感谢这是一个很好的解决方案。所以还有一个问题。 Path中ID的首次出现索引有什么作用?
    • 为了更好地理解它,在查询的 SELECT 子句中包含 FIND_IN_SET(ID, REPLACE(Path, '.', ',')) 只是为了查看它为每一行返回的数字。
    【解决方案2】:

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

    所以路径列应该如下所示:

    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 之前

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

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

    【讨论】:

    • 不是那么容易的哥们。我说的是每一层。这仅在两行具有相同路径时才有效
    • 啊好吧等等..我太快了,让我看看
    • 非常棘手的解决方案。听起来也像一个工作的。让我测试一下
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-17
    • 1970-01-01
    • 2015-01-24
    • 2011-03-14
    • 2013-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多