Php MySQL父级->;子查询
我使用的是mySQL,我需要从一个表中选择与另一个表的父->子数据层次结构中任何级别的ID匹配的数据 此外,我想用一个编写良好的SQL查询来解决这个问题,而不是在PHP代码中使用递归函数,因为这个特性将被大量使用 我确实尝试过搜索,我偶然发现了许多类似的问题(大部分问题都已解决),但没有一个对我有帮助 为了帮助说明这种情况,下面是我当前的设置 表“条款”:Php MySQL父级->;子查询,php,mysql,hierarchical-data,Php,Mysql,Hierarchical Data,我使用的是mySQL,我需要从一个表中选择与另一个表的父->子数据层次结构中任何级别的ID匹配的数据 此外,我想用一个编写良好的SQL查询来解决这个问题,而不是在PHP代码中使用递归函数,因为这个特性将被大量使用 我确实尝试过搜索,我偶然发现了许多类似的问题(大部分问题都已解决),但没有一个对我有帮助 为了帮助说明这种情况,下面是我当前的设置 表“条款”: 第11条 类别识别码 表类别 类别识别码 家长id 我需要从“articles”中选择所有文章,其中“articles.cate
- 第11条
- 类别识别码
- 类别识别码
- 家长id
谢谢。在关系数据库中存储分层数据最常见的模式是相邻列表或。另一种方法是使用物质化路径,它基本上是一种缓存机制,位于相邻列表的顶部。另请参见。在关系数据库中存储分层数据的最常见模式是相邻列表或。另一种方法是使用物质化路径,它基本上是一种缓存机制,位于相邻列表的顶部。另请参见。如果您使用的是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
有关更多详细信息,请参阅我的博客中的这篇文章:
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
有关更多详细信息,请参阅我的博客中的这篇文章: