Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 子类别层次结构_Php_Mysql - Fatal编程技术网

Php 子类别层次结构

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” 我怎样才能有效地把它们都取出来?(比如说面包屑) 谢谢 这应该可以完成这

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

我有三张桌子:

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已经负责缓存了,所以我将继续使用邻接列表-我确实读过“预排序树遍历”方法,但现在根本没有时间将其转换为代码。。。