Php 子类别层次结构
我设计了一个SQL结构来表示类别及其子类别 我有三张桌子:Php 子类别层次结构,php,mysql,Php,Mysql,我设计了一个SQL结构来表示类别及其子类别 我有三张桌子: articles articles_categories categories 文章表: id,title,content 类别表: id, title, parent_id 物品类别: id,article_id,category_id SQL没有问题,但是现在-假设我在文章ID5上 项目id 5有-3个类别,其中2个类别有父类别,主类别的父类别为“0” 我怎样才能有效地把它们都取出来?(比如说面包屑) 谢谢 这应该可以完成这
articles
articles_categories
categories
文章表:
id,title,content
类别表:
id, title, parent_id
物品类别:
id,article_id,category_id
SQL没有问题,但是现在-假设我在文章ID5上
项目id 5有-3个类别,其中2个类别有父类别,主类别的父类别为“0”
我怎样才能有效地把它们都取出来?(比如说面包屑)
谢谢 这应该可以完成这项工作:
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 |
+------+------------+-------------+------+--------+-----------+
此外,我将从关联表
文章\u类别中删除“id”列
这应该可以完成以下工作:
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 |
+------+------------+-------------+------+--------+-----------+
此外,我将从关联表
文章\u类别中删除“id”列,除非类别层次结构的深度是固定的,否则在MySQL中无法使用当前模型(邻接列表)执行此操作。您必须在一个循环中使用多个SQL语句遍历层次结构
如果类别层次结构相当静态,则可以使用以下方法“预计算”树:
- 路径枚举
- 嵌套集
- 闭合表
所有这些都是以写性能换取读性能。
谷歌或搜索任何上述内容,你会发现如何实现它的例子
我经常发现,将数据存储在邻接列表中(因为数据模型最匹配)并在应用程序中缓存树的副本就足够了,但这当然取决于您的需求:)除非类别层次结构的深度是固定的,否则您无法在MySQL中使用当前模型(邻接列表)来执行此操作. 您必须在一个循环中使用多个SQL语句遍历层次结构
如果类别层次结构相当静态,则可以使用以下方法“预计算”树:
- 路径枚举
- 嵌套集
- 闭合表
所有这些都是以写性能换取读性能。
谷歌或搜索任何上述内容,你会发现如何实现它的例子
我经常发现,将数据存储在邻接列表中(因为数据模型最匹配)并在应用程序中缓存树的副本就足够了,但这当然取决于您的要求:)是文章-类别
多对多
关系。如果是这样,我会选择Ronnis answeris文章
-类别
多对多
关系。如果是这样的话,我会选择罗尼斯的回答。在紧急情况下,我会做得很好的!:)谢谢,我使用的CI已经负责缓存了,所以我将继续使用邻接列表-我确实读过“预排序树遍历”方法,但现在根本没有时间将其转换为代码…在紧急情况下就足够了!:)谢谢,我使用的CI已经负责缓存了,所以我将继续使用邻接列表-我确实读过“预排序树遍历”方法,但现在根本没有时间将其转换为代码。。。