我正在创建一个电子商务网站,其中我在网址中有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
答案 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`
否则,如果您不确定结果可能达到多少级别,那么您将需要编写一个存储过程。