按外键中的递归量对MySQL查询结果进行排序

时间:2018-03-26 12:14:08

标签: mysql recursion sql-order-by hierarchical-data

我有下表:

+----+--------+
| id | parent |
+----+--------+
|  1 | 4      |
|  2 | 1      |
|  3 | NULL   |
|  4 | NULL   |
|  5 | 2      |
|  6 | 3      |
+----+--------+

我希望这个表的排序方式如下:

+----+--------+------------------------------------------------------------+
| id | parent |             Why it has to be ordered like this             |
+----+--------+------------------------------------------------------------+
|  5 | 2      | 5 has parent 2 has parent 1 has parent 4. So 3 rows above. |
|  2 | 1      | 2 has parent 1 has parent 4. So 2 rows above.              |
|  1 | 4      | 1 has parent 4. So 1 row above.                            |
|  6 | 3      | 6 has parent 3. So 1 row above.                            |
|  4 | NULL   | No parent. So 0 rows above.                                |
|  3 | NULL   | No parent. So 0 rows above.                                |
+----+--------+------------------------------------------------------------+

所以我想递归计算一行的祖先并对其进行排序。我怎么能这样做?

编辑:我使用的是MySQL版本5.7.21。

1 个答案:

答案 0 :(得分:1)

您可以使用递归CTE执行此操作,但您没有列出您的mysql版本,并且并非所有版本都可以执行此操作,因此这里的内容甚至可以用于旧版本。这使用临时表和while语句进行递归。临时表使用主表中每条记录的一条记录构建,该记录保存父计数数据。首先我们做所有没有父节点的记录,然后while内的查询执行下一代的所有记录。请注意,语法可能有点偏离,我还没有完成mysql一段时间。

[^...]