一个很好的入门读物是MySQL 中的分层数据 (我以前可以在 MySQL.com 网站上找到它,啊)
阅读?
这是使用邻接列表模型的方法。但仅适用于已知固定数量的嵌套 (本示例为四个嵌套级别)。
我会找出我的哪些页面是(树的)根页面。然后只选择那些有查询的。将 放入LIMIT x,x
此 select 语句中。
之后,以下语句:(或类似的东西)
string query = "
SELECT t1.name AS lev1, t2.name as lev2, t3.name as lev3, t4.name as lev4
FROM category AS t1
LEFT JOIN category AS t2 ON t2.parent = t1.category_id
LEFT JOIN category AS t3 ON t3.parent = t2.category_id
LEFT JOIN category AS t4 ON t4.parent = t3.category_id
WHERE t1.name IN('ELECTRONICS', '<some other name>');
";
可以返回如下内容:
+-------------+----------------------+--------------+-------+
| lev1 | lev2 | lev3 | lev4 |
+-------------+----------------------+--------------+-------+
| ELECTRONICS | TELEVISIONS | TUBE | NULL |
| ELECTRONICS | TELEVISIONS | LCD | NULL |
| ELECTRONICS | TELEVISIONS | PLASMA | NULL |
| ELECTRONICS | PORTABLE ELECTRONICS | MP3 PLAYERS | FLASH |
| ELECTRONICS | PORTABLE ELECTRONICS | CD PLAYERS | NULL |
| ELECTRONICS | PORTABLE ELECTRONICS | 2 WAY RADIOS | NULL |
| etc... | etc... | etc... | |
+-------------+----------------------+--------------+-------+
诀窍是在查询语句中仅使用带有限制的查询的根名称(或 ID,如果需要)IN()
。
这应该仍然表现得很好(理论上)。
上述查询的原理也可用于找出树的根中有多少后代(有点神奇;)此外GROUP BY
,COUNT()
您可以使用此原理找出您的哪些页面是根(尽管我会出于性能原因将其保存在 tabledata 中)
如果您想要动态数量的嵌套 (几乎无限缩放),那么实现嵌套集将是可行的方法。