嘿,我使用:
在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列排序。有没有简单的方法可以反过来订购它,或者有另一个像“成本”这样的列,其中相同“深度”的所有条目都按成本排序?
由于
答案 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
,在外部SELECT
和ORDER BY thedepth DESC, thecost ASC
或其他任何内容中获取它。
表现可能会或可能不会很好,但你只能通过尝试(和EXPLAIN SELECT
并添加适当的指数来表达;)。
如果您拥有足够智能的数据库引擎,则不需要嵌套 - 您可以直接ORDER BY
计算列(此处为thedepth
)。但我认为这个解决方案适用于更多/更旧的数据库引擎/版本。