2011-02-27 57 views
0

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

我有3个表:

文章表:

id,title,content 

分类表:

id, title, parent_id 

articles_categories:

id,article_id,category_id 

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

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

谢谢!

+1

是'文章''分类'多对多关系。如果是的话,我会去罗尼斯回答 – 2011-02-27 09:59:37

回答

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” 列。

3

除非类别层次结构的深度是固定的,否则不能在您的当前模型(邻接表)中使用MySQL。您必须在循环中使用几个SQL语句来遍历层次结构。

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

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

以上所有的,交易为读取业绩写绩效。 谷歌或搜索以上任何一个,你会发现如何实现它的例子。

很多时候,我发现将数据存储在邻接列表中(因为最匹配数据模型)并在应用程序中缓存树的副本足够好,但这取决于您的要求当然:)

+0

*够好*会在紧急情况下做到! :)谢谢,我使用已经处理缓存的CI,所以我只需坚持邻接列表 - 我已经阅读了“预定义树遍历”方法,但现在根本没有时间将其转换为代码... – 2011-10-15 02:41:52