[英]Get all descendants in one query?
我正在創建一個電子商務網站,其中我在URL中有category_id
,並且基於category_id
我將查詢所有子孫(如果找到),因此我可以顯示僅與該category_id
相關的產品。 這個查詢真的很酷,因為它不關心它有多少個父親...它只是尋找所有的父母,直到找不到它為止。
我遇到的問題是我的查詢只會得到父母和祖父母(如果找到),但我似乎無法使這個查詢獲得所有子行或孫子如果找到。 這個查詢是從這里提取的,所以我沒有寫出查詢,我很難做出正確的更改......我昨天整天都在嘗試。
編輯此查詢也不會獲得所有相關的子孫(如果找到)。 我想要所有孩子和大孩子(如果找到的話)。
編輯這里是可以找到我的數據的SQL小提琴 。
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
有另一種方法可以實現此目的,但它需要第二個層次結構表。
附加表每個父方向關系包含一行,如:
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
可以通過代碼或觸發器維護此表。 它使得選擇整個層次結構變得微不足道並且非常快,但是增加了一些維護(添加/刪除)開銷,因此您需要考慮長期成本與開銷。
如果您事先知道@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`
否則,如果您不確定結果可能達到多少級別,那么您將需要編寫存儲過程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.