3

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

我遇到的问题是我的查询只会获得父母和祖父母(如果找到),但我无法弄清楚如何让这个查询获得所有子行或孙子行(如果找到)。这个查询是从这里提取的,所以我没有写查询,而且我很难做出正确的改变……我昨天试了一整天。

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

编辑 这是可以找到我的数据的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

4

2 回答 2

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

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

于 2013-01-28T10:01:30.967 回答
0

如果您事先知道@rambocoder指示的最大可能深度......</p>

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`

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

于 2013-01-27T17:32:42.763 回答