Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.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 MySQL父级->;子查询_Php_Mysql_Hierarchical Data - Fatal编程技术网

Php MySQL父级->;子查询

Php MySQL父级->;子查询,php,mysql,hierarchical-data,Php,Mysql,Hierarchical Data,我使用的是mySQL,我需要从一个表中选择与另一个表的父->子数据层次结构中任何级别的ID匹配的数据 此外,我想用一个编写良好的SQL查询来解决这个问题,而不是在PHP代码中使用递归函数,因为这个特性将被大量使用 我确实尝试过搜索,我偶然发现了许多类似的问题(大部分问题都已解决),但没有一个对我有帮助 为了帮助说明这种情况,下面是我当前的设置 表“条款”: 第11条 类别识别码 表类别 类别识别码 家长id 我需要从“articles”中选择所有文章,其中“articles.cate

我使用的是mySQL,我需要从一个表中选择与另一个表的父->子数据层次结构中任何级别的ID匹配的数据

此外,我想用一个编写良好的SQL查询来解决这个问题,而不是在PHP代码中使用递归函数,因为这个特性将被大量使用

我确实尝试过搜索,我偶然发现了许多类似的问题(大部分问题都已解决),但没有一个对我有帮助

为了帮助说明这种情况,下面是我当前的设置

表“条款”:

  • 第11条
  • 类别识别码
表类别

  • 类别识别码
  • 家长id
我需要从“articles”中选择所有文章,其中“articles.category_id”是10。但也会从“categories.category_id”10所属的树中接收所有类别的所有文章

意思是,其中“10”是父母及其所有子女,向上,其中10是子女及其所有父母

没有递归php函数是否可能


谢谢。

在关系数据库中存储分层数据最常见的模式是相邻列表或。另一种方法是使用物质化路径,它基本上是一种缓存机制,位于相邻列表的顶部。另请参见。

在关系数据库中存储分层数据的最常见模式是相邻列表或。另一种方法是使用物质化路径,它基本上是一种缓存机制,位于相邻列表的顶部。另请参见。

如果您使用的是MySQL,则不可能使用您正在使用的邻接列表设计在一个查询中获取整个树

其他一些品牌的数据库支持SQL扩展来处理这种设计。Oracle、Microsoft SQL Server、IBM DB2和PostgreSQL 8.4(目前处于测试阶段)支持SQL扩展

其他数据库设计允许您更高效地查询树。这个问题已经在StackOverflow、博客和文章中多次提到


您还可以阅读Joe Celko的“”一文,该文深入介绍了几种类似的设计。

如果您使用的是MySQL,则不可能使用您正在使用的邻接列表设计在一个查询中获取整个树

其他一些品牌的数据库支持SQL扩展来处理这种设计。Oracle、Microsoft SQL Server、IBM DB2和PostgreSQL 8.4(目前处于测试阶段)支持SQL扩展

其他数据库设计允许您更高效地查询树。这个问题已经在StackOverflow、博客和文章中多次提到


您还可以阅读Joe Celko的“”一文,其中深入介绍了几种此类设计。

我不知道这对您有多大帮助,但我编写了一个小函数,它使用一个MySQL查询生成一个层次结构树。基本上,所有重要的逻辑都转移到PHP中。我的解决方案使用邻接列表模型,然后利用PHP引用,通过平面数据结构构建树数据结构。看看下面的要点,看看你是否得到了一些灵感。我会帮你更多的,但是在我的工作中我必须处理一些问题


我不知道这对您有多大帮助,但我编写了一个小函数,它使用一个MySQL查询生成一个层次结构树。基本上,所有重要的逻辑都转移到PHP中。我的解决方案使用邻接列表模型,然后利用PHP引用,通过平面数据结构构建树数据结构。看看下面的要点,看看你是否得到了一些灵感。我会帮你更多的,但是在我的工作中我必须处理一些问题


这在
MySQL
中是可以做到的,但需要一点努力。您必须编写如下函数:

CREATE FUNCTION hierarchy_connect_by_parent_eq_prior_id(value INT) RETURNS INT
NOT DETERMINISTIC
READS SQL DATA
BEGIN
        DECLARE _id INT;
        DECLARE _parent INT;
        DECLARE _next INT;
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET @id = NULL;

        SET _parent = @id;
        SET _id = -1;

        IF @id IS NULL THEN
                RETURN NULL;
        END IF;

        LOOP
                SELECT  MIN(id)
                INTO    @id
                FROM    categories
                WHERE   parent = _parent
                        AND id > _id;
                IF @id IS NOT NULL OR _parent = @start_with THEN
                        SET @level = @level + 1;
                        RETURN @id;
                END IF;
                SET @level := @level - 1;
                SELECT  id, parent
                INTO    _id, _parent
                FROM    categories
                WHERE   id = _parent;
        END LOOP;
END
并在查询中使用它:

SELECT  id, parent, level
FROM    (
        SELECT  hierarchy_connect_by_parent_eq_prior_id(id) AS id, @level AS level
        FROM    (
                SELECT  @start_with := 0,
                        @id := @start_with,
                        @level := 0
                ) vars, categories 
        WHERE   @id IS NOT NULL
        ) ho
JOIN    categories hi
ON      hi.id = ho.id
有关更多详细信息,请参阅我的博客中的这篇文章:


这在MySQL中是可以做到的,但需要一点努力。您必须编写如下函数:

CREATE FUNCTION hierarchy_connect_by_parent_eq_prior_id(value INT) RETURNS INT
NOT DETERMINISTIC
READS SQL DATA
BEGIN
        DECLARE _id INT;
        DECLARE _parent INT;
        DECLARE _next INT;
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET @id = NULL;

        SET _parent = @id;
        SET _id = -1;

        IF @id IS NULL THEN
                RETURN NULL;
        END IF;

        LOOP
                SELECT  MIN(id)
                INTO    @id
                FROM    categories
                WHERE   parent = _parent
                        AND id > _id;
                IF @id IS NOT NULL OR _parent = @start_with THEN
                        SET @level = @level + 1;
                        RETURN @id;
                END IF;
                SET @level := @level - 1;
                SELECT  id, parent
                INTO    _id, _parent
                FROM    categories
                WHERE   id = _parent;
        END LOOP;
END
并在查询中使用它:

SELECT  id, parent, level
FROM    (
        SELECT  hierarchy_connect_by_parent_eq_prior_id(id) AS id, @level AS level
        FROM    (
                SELECT  @start_with := 0,
                        @id := @start_with,
                        @level := 0
                ) vars, categories 
        WHERE   @id IS NOT NULL
        ) ho
JOIN    categories hi
ON      hi.id = ho.id
有关更多详细信息,请参阅我的博客中的这篇文章:


比尔,如果你能在我的回答中找到我所说的函数中的任何流,我会很感兴趣的。我知道你处理数据库的经验比我丰富得多。@Ionut:好的,请看我对你答案的评论。比尔,谢谢你花时间看一下。我真的很感激。比尔,如果你能在我的回答中找到我所说的函数中的任何流,我会很感兴趣的。我知道你处理数据库的经验比我丰富得多。@Ionut:好的,请看我对你答案的评论。比尔,谢谢你花时间看一下。我真的很感激。好的,我读了你的代码。如何编写只包含所需层次结构中的节点的查询?例如,假设您正在运行Slashdot。数百万条注释排列在数千个独立的层次结构中,但存储在单个数据库表中。如何只查询属于用户当前查看的线程的注释?我想这是我实现中的弱点。对于大型数据集,在内存中获取整个表数据没有多大意义。我的解决方案是这样的。在我写这篇文章的时候,人们认为它适用于具有少量数据的表(不确定小数据到底意味着什么),我认为在一个查询中获取所有数据比在多个查询中获取小数据块更好。到达某个“线程”将在PHP代码中完成。一次获取所有数据还是一次获取位更好,取决于有多少数据。:-)为了缓解这种情况,您可以做的一件事是,除了“父节点id”之外,还存储每个树节点的“根节点id”。这样,您就可以查询具有相同“root\u id”的所有行,并确保结果