簡體   English   中英

在一個查詢中獲取所有后代?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM