子类别层次结构

时间:2011-02-27 09:39:10

标签: php mysql

我设计了一个SQL结构来表示类别及其子类别。

我有3张桌子:

articles
articles_categories
categories

文章表:

id,title,content

分类表:

id, title, parent_id

articles_categories:

id,article_id,category_id

SQL没有问题,但现在 - 让我说我正在文章ID 5 文章ID 5有 - 3个类别,其中2个有父母,主要有'0'作为父母。

如何有效地获取它们? (比方说 - 面包屑)。

谢谢!

2 个答案:

答案 0 :(得分:3)

除非修复了类别层次结构的深度,否则不能使用当前模型(邻接列表)在MySQL中执行此操作。您必须在循环中使用多个SQL语句遍历层次结构。

如果类别层次结构是相当静态的,您可以使用以下命令“预先计算”树

  • 路径枚举
  • 嵌套集
  • 关闭表

以上所有,交易为读取性能写入性能。 谷歌或搜索上述任何一个的SO,你会发现如何实现它的例子。

通常,我发现将数据存储在邻接列表中(因为最匹配数据模型)并在应用程序中缓存树的副本已经足够了,但这取决于您的要求当然:)< / p>

答案 1 :(得分:2)

这应该做的工作:

select * from articles_categories 
left join categories on categories.id = articles_categories.category_id 
where article_id=1;

+------+------------+-------------+------+--------+-----------+
| id   | article_id | category_id | id   | title  | parent_id |
+------+------------+-------------+------+--------+-----------+
| NULL |          1 |           1 |    1 | first  |         0 |
| NULL |          1 |           2 |    2 | second |         1 |
| NULL |          1 |           3 |    3 | third  |         2 |
+------+------------+-------------+------+--------+-----------+

此外,我会从关联表articles_categories中删除“id”列。