【问题标题】:Order the rows of a MySQL result based on a "next_id" field根据“next_id”字段对 MySQL 结果的行进行排序
【发布时间】:2011-08-13 08:40:03
【问题描述】:

我目前正在处理一个结构如下的数据库表:

 ______________________________
|  id  |  content  |  next_id  |
|------|-----------|-----------|
|  1   |  (value)  |     4     |
|  2   |  (value)  |     1     |
|  3   |  (value)  |   (NULL)  |
|  4   |  (value)  |     3     |
 ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

next_id 字段的值定义了应该跟随它的数据行的 ID。 NULL 的值表示后面没有行。

有没有一种方法可以查询数据库,以便使用此方法对结果行进行排序?例如,在我上面给出的情况下,应该按顺序返回行,以便 id 按以下顺序排列:2143。我正在寻找一种解决方案,无论此序列中的行数如何,都可以做到这一点。

我知道可以在从数据库中检索结果后重新排序(使用我正在使用的编程语言),但我希望有一种方法可以在 SQL 中完成。

【问题讨论】:

  • 这非常类似于无限层深度的嵌套。
  • 使用过程或您的编程语言。
  • 在我看来您需要将数据结构转换为使用嵌套集,然后这种查询会更容易。
  • 存在什么样的约束?即,我可以拥有(1,2)(2,1) 吗?如果我有(1,4)(4,2)(2,1),会发生什么?
  • @Thomas 您可以假设数据库中的数据格式正确;即,不应有您在示例中给出的循环引用。

标签: mysql sql sorting


【解决方案1】:

如果没有与行数一样多的自联接,我看不到解决方案。相反,我会使用下推堆栈算法在临时表中构建一个嵌套集,然后检索一棵完整的树。

【讨论】:

    【解决方案2】:

    我有一些很接近的东西。

    /*one select to init the @next variable to the first row*/
    select @next:= id from table1 order by isnull(next_id) asc, next_id asc limit 1;
    
    
    select distinct a.id, a.next_id from table1 b
      inner join
      (
        select @rank:= id as id, @next:= next_id as next_id from table1
        where id = @next
      ) a
      on (b.id = b.id);
    

    这个输出

    +----+---------+
    | id | next_id |
    +----+---------+
    | 2  | 1       |
    | 1  | 4       |
    

    然后停止。要是我能找到让它继续下去的方法就好了....

    无论如何,这种在查询中强制输入值在进行排名时已经足够狡猾了,更不用说这种东西了,所以我可能会走上死胡同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-06
      • 1970-01-01
      • 2016-07-03
      • 1970-01-01
      • 2021-04-06
      • 1970-01-01
      • 2020-04-10
      • 1970-01-01
      相关资源
      最近更新 更多