Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.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
Mysql 在一个查询中获取所有子体?_Mysql_Sql_Database - Fatal编程技术网

Mysql 在一个查询中获取所有子体?

Mysql 在一个查询中获取所有子体?,mysql,sql,database,Mysql,Sql,Database,我正在创建一个电子商务网站,我在URL中有category\u id,根据category\u id,我将查询所有的子代和孙辈(如果找到),这样我就可以只显示与该category\u id相关的产品。这个查询非常酷,因为它不关心有多少父代。。。它只是寻找所有的父母,直到找不到更多 我遇到的问题是,如果找到,我的查询将只获取父级和外祖父母,但我似乎不知道如何使此查询获取所有子行或孙子(如果找到)。此查询是从中提取的,因此我没有编写查询,很难做出正确的更改。。。昨天我试了一整天 编辑 如果找到,此查

我正在创建一个电子商务网站,我在URL中有category\u id,根据category\u id,我将查询所有的子代和孙辈(如果找到),这样我就可以只显示与该category\u id相关的产品。这个查询非常酷,因为它不关心有多少父代。。。它只是寻找所有的父母,直到找不到更多

我遇到的问题是,如果找到,我的查询将只获取父级和外祖父母,但我似乎不知道如何使此查询获取所有子行或孙子(如果找到)。此查询是从中提取的,因此我没有编写查询,很难做出正确的更改。。。昨天我试了一整天

编辑 如果找到,此查询也不会获取所有相关的子代和子代。我想要所有的孩子和孙子,如果找到的话

编辑 在这里可以找到我的数据

SELECT T2.category_id, T2.category_name 
FROM (SELECT @r AS _id, (SELECT @r := parent 
FROM categories 
WHERE category_id = _id) AS parent 
FROM (SELECT @r := 182)vars, categories h 
WHERE @r <> 0) T1 
JOIN categories T2 
ON T1._id = T2.category_id 
ORDER BY category_id ASC
以下是我的表模式:


category_id | category_name | parent

如果您事先知道所指示的最大可能深度

SELECT
    p.`category_id`,p.`category_name` AS 'parent',
    c.`category_name` AS 'child',
    gc.`category_name` AS 'grandchild'
FROM (SELECT * FROM `categories` WHERE `parent` IS NULL) p
INNER JOIN `categories` c
ON c.`parent`=p.`category_id`
INNER JOIN `categories` gc
ON gc.`category_id`=c.`category_id`
WHERE p.`category_id`=120
ORDER BY c.`category_id`, gc.`category_id`

否则,如果您不确定结果的深度,则需要编写一个存储过程。

有另一种方法可以实现这一点,但它需要第二个层次结构表

附加表中每个父方向关系包含一行,如中所示:

category_id category_name parent
   1           cat1          1
   2           cat2          1
   3           cat3          1
   4           cat4          2
   5           cat5          3
   6           cat6          5

category_id ancestor
   1           1
   2           1
   3           1
   4           1
   4           2
   5           1
   5           3
   6           1
   6           3
   6           5

此表可以由代码或触发器维护。它使得选择整个层次结构是微不足道的,而且很快,但是增加了一些维护加/删除开销,所以你需要考虑长期开销和开销。

希望这有助于:嘿,Sashi,就这么接近了。但是我想在数据库级别而不是应用程序级别上实现这一点。@mike是否愿意提供一些示例数据和基于此的预期结果=另外,你可能想退房。用户可以这样做,我希望他能看看。只要每行有一个父指针或子指针,就可以用宿主编程语言组装完整的层次结构例如:所有子体。如果你有一个有限且合理的最大深度n,另一个选择是在查询中只使用n个左连接。我感谢你的时间,我的帖子中的查询实际上可以在任何级别上工作。例如,如果运行查询181,将得到两个级别。如果你用182跑,你会得到3级,如果你用119跑,你会得到1级。问题是它得到的层次结构向上,我需要它向下。什么是最高水平?我的意思是,可以有一个孙子孙女,例如?最大级别是动态的,它可以有孙子孙女和其他。如果深度未知,您将需要一个proc。在您的示例中,您是正确的,但本文中的第一个查询不需要函数来实现这一点。这与我在小提琴中使用的查询相同。很多人说它必须需要一个函数,但我现在只需要一个查询,没有函数。问题是它从插入点类别_id=181或其他任何内容获取父级的层次结构。我需要它从插入点向下到最低层,不管是孩子,孙子,孙子。