2011-11-30 68 views
4

我想從類別表中的前父ID:如何從嵌套類別表中獲取頂級父項?

+-------------+----------------------+--------+ 
| category_id | name     | parent | 
+-------------+----------------------+--------+ 
|   1 | ELECTRONICS   | NULL | 
|   2 | TELEVISIONS   |  1 | 
|   3 | TUBE     |  2 | 
|   4 | LCD     |  2 | 
|   5 | PLASMA    |  2 | 
|   6 | PORTABLE ELECTRONICS |  1 | 
|   7 | MP3 PLAYERS   |  6 | 
|   8 | FLASH    |  7 | 
|   9 | CD PLAYERS   |  6 | 
|   10 | 2 WAY RADIOS   |  6 | 
+-------------+----------------------+--------+ 

可以有很多子類的,我的問題是如何獲得的任何子類別是頂級的家長嗎?
例如,在數據庫的子類別節點可以是這樣的:
父>>子類別>> subsubcategory >> subsubsubcategory
和另一個節點可以是這樣的:
父>>子類別

所以,如果我查詢id = 6的子類別的頂級父,我得到ELECTRONICS等。
如何獲得頂級父母身份證與MySQL?我希望這是完全可以理解的。

+0

你必須使用SQL函數做到這一點。 –

+0

你的意思是什麼樣的SQL函數? – sunpietro

+1

不是內置函數。您需要編寫自己的或在互聯網上找到具有類似行爲的功能,然後進行編輯。 –

回答

2

你必須寫一個存儲功能循環查詢:

查詢找到父

SELECT parent FROM cat WHERE category_id = 6 

存儲功能找到頂級父

DELIMITER $$ 

CREATE FUNCTION top_parent(PCat INTEGER) RETURNS INTEGER 
BEGIN 
    DECLARE MyParent INTEGER; 
    DECLARE PrevParent INTEGER; 
    SET PrevParent = PCat; 
    REPEAT 
    SELECT parent INTO MyParent FROM cat WHERE category_id = PrevParent; 
    IF NOT(MyParent IS NULL) THEN 
     SET PrevParent = MyParent; 
    END IF; 
    UNTIL (MyParent IS NULL) 
    END REPEAT; 
    RETURN PrevParent; 
END $$ 

DELIMITER ; 

如何在查詢中使用該功能

SELECT name FROM cat WHERE category_id = top_parent(6) 
0

@r := 7不管你給這裏將得到所有其父親,並且提供限制1的CATEGORY_ID將獲得最高父


 
SELECT T2.* 
FROM (
     SELECT 
     @r AS _category_id, 
     (SELECT @r := parent FROM categories WHERE category_id = _category_id) AS parent, 
     @l := @l + 1 AS lvl 
     FROM 
     (SELECT @r := 7, @l := 0) vars, 
     categories WHERE @r <> 0) T1 
    JOIN categories T2 
    ON T1._category_id = T2.category_id 
ORDER BY T1.lvl DESC 
LIMIT 1; 

相關問題