php - 检查 n 深度树中的值?

标签 php mysql adjacency-list

我有两个实体,postcategory,它们是 1:n 关系。

我有一个包含两列的引用表,post_id,category_id

categories 表有一个id 列、一个status 列和一个parent_id

如果一个类别是另一个类别的子类别(n 深度),那么它的 parent_id 不为空。

如果类别在线则状态为 1,否则为 0。

我需要做的是找出帖子是否可见。

这需要:

对于加入帖子的每个类别,如果这些类别中的任何一个具有 status 0 那么该路径被认为是离线的。

如果任何路径在线,则该帖子被认为是可见的,否则它是隐藏的。

我能想到的唯一方法(作为半伪代码)是:

function visible(category_ids){
  categories = //select * from categories where id in(category_ids)
  online = false
  foreach(categories as category){
    if(category.status == 0)
      continue;

    children = //select id from categories where parent_id = category.id
    if(children)
      online = visible(children)
  }
  return online
}

categories = //select c.id from categories c join posts_categories pc on pc.category_id = c.id where pc.post_id = post.id

post.online = visible(categories)

但这最终可能会变成大量的 sql 查询,有没有更好的方法?

最佳答案

如果嵌套集不是一个选项,我知道以下内容:

  • 如果数据是有序的,这样父项的子项总是跟在父项之后,您可以通过跳过输出中的隐藏节点,对所有数据进行一次数据库查询来解决此问题。

这同样适用于已排序的嵌套集,原则已在 this answer 中概述,但是有关获取深度的算法不起作用,我建议使用能够删除隐藏项的 recursive iterator

此外,如果数据未排序,您可以从所有行的(未排序的)查询创建树结构,如 the answer to Nested array. Third level is disappearing 中所述。不需要递归,你会得到一个你可以轻松输出的结构,我也应该在另一个答案中涵盖 <ul>/<li> html 样式输出。

关于php - 检查 n 深度树中的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12758853/

相关文章:

php - PHP 的 gc_enable 函数到底做了什么?

php - 如何设置自定义 laravel 资源 Controller 请求 url

mysql - 从 LEFT JOIN 查询中删除重复项

c - 使用邻接表进行深度优先搜索

c++ - 我如何知道模板邻接列表中有哪些可用的 Boost Graph 属性?

php - 将 mysql 查询移出循环

php - 如何在 Bisna 中正确加载 DoctrineExtensions?

c# - 从邻接表创建树的最有效方法

javascript - 在多表列中具有多个术语的简单 PHP 过滤器

php - 如何在选中另一个复选框时取消选中复选框?