在一个查询中获取所有后代?

时间:2013-01-27 15:00:12

标签: mysql sql database

我正在创建一个电子商务网站,其中我在网址中有category_id并基于category_id我将查询所有子孙(如果找到),以便我可以显示仅与category_id相关的产品。这个查询真的很酷,因为它不关心它有多少父母......它只是寻找所有的父母,直到找不到它为止。

我遇到的问题是我的查询只会得到父母和祖父母(如果找到),但我似乎无法让这个查询获得所有子行或孙子如果找到。此查询是从here提取的,因此我没有编写查询,而且我很难做出正确的更改...我昨天整天都在尝试。

修改 此查询也不会获得所有相关的子孙(如果找到)。我想要所有孩子和大孩子(如果找到的话)。

修改 这是可以找到我的数据的SQL Fiddle

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

2 个答案:

答案 0 :(得分:1)

有另一种方法可以实现此目的,但它需要第二个层次表。

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

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

此表可以由您的代码或触发器维护。它使得选择整个层次结构变得微不足道并且非常快,但是增加了一些维护(添加/删除)开销,因此您需要考虑长期成本与开销。

答案 1 :(得分:0)

如果事先知道@rambocoder指示的最大可能深度......

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`

否则,如果您不确定结果可能达到多少级别,那么您将需要编写一个存储过程。