排序修改后的preorder遍历mysql树

时间:2009-06-15 00:00:43

标签: mysql tree sorting traversal

嘿,我使用:

在mysql表中实现了一个树

http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

这是您有一个表格的方法:

+-------------+----------------------+-----+-----+
| category_id | name                 | lft | rgt |
+-------------+----------------------+-----+-----+
|           1 | ELECTRONICS          |   1 |  20 |
|           2 | TELEVISIONS          |   2 |   9 |
|           3 | TUBE                 |   3 |   4 |
|           4 | LCD                  |   5 |   6 |
|           5 | PLASMA               |   7 |   8 |
|           6 | PORTABLE ELECTRONICS |  10 |  19 |
|           7 | MP3 PLAYERS          |  11 |  14 |
|           8 | FLASH                |  12 |  13 |
|           9 | CD PLAYERS           |  15 |  16 |
|          10 | 2 WAY RADIOS         |  17 |  18 |
+-------------+----------------------+-----+-----+

要像往常一样打印出表格,你只需要按照lft列排序。有没有简单的方法可以反过来订购它,或者有另一个像“成本”这样的列,其中相同“深度”的所有条目都按成本排序?

由于

1 个答案:

答案 0 :(得分:0)

您引用的网址会显示如何获得提供深度的SELECT - 如果您将其嵌套到另一个SELECT中,您可以根据需要进行排序。例如:

SELECT thename, thedepth
FROM (
  SELECT node.name AS thename, (COUNT(parent.name) - 1) AS thedepth
  FROM nested_category AS node,
  nested_category AS parent
  WHERE node.lft BETWEEN parent.lft AND parent.rgt
  GROUP BY node.name
  ORDER BY node.lft) plain
ORDER BY thedepth DESC;

同样,当然,您可以在内部node.cost AS thecost中拥有SELECT,在外部SELECTORDER BY thedepth DESC, thecost ASC或其他任何内容中获取它。

表现可能会或可能不会很好,但你只能通过尝试(和EXPLAIN SELECT并添加适当的指数来表达;)。

如果您拥有足够智能的数据库引擎,则不需要嵌套 - 您可以直接ORDER BY计算列(此处为thedepth)。但我认为这个解决方案适用于更多/更旧的数据库引擎/版本。