2014-01-17 15 views
0

我有這樣一個表:從PHPMYSQL:創建一個查詢顯示輸入的父/ hirearchy(Breadcumbs)

--------------------Categories------------------- 
| Category  | Label   | Parent  | 
************************************************* 
|/   | Home   | NULL   | 
------------------------------------------------- 
| leasing  | Leasing  |/   | 
------------------------------------------------- 
| leasing-steps | Leasing Steps | leasing  | 
------------------------------------------------- 
| new-tenant | New Tenants | leasing-steps | 
------------------------------------------------- 
| properties | Properties | leasing  | 
------------------------------------------------- 
| about   | About Us  |/   | 
------------------------------------------------- 

我收到一個變量(類別),假設值是'leasing-steps'

我需要想出一個SQL查詢,它將能夠採取任何類別,並以正確的順序給我它的層次結構。在這個例子中('leasing-steps'),那就要輸出這樣的:

---Categories--- 
| Category  | 
***************** 
|/   | 
----------------- 
| leasing  | 
----------------- 
| leasing-steps | 
----------------- 

我嘗試這樣做:

SELECT `Cat1`.`Category` 
FROM Categories AS `Cat1` 
LEFT JOIN Categories AS `Cat2` ON `Cat1`.`Parent` 
WHERE `Cat1`.`Category` = 'leasing-steps' 

但它只是給了我1個條目,而不是期望的結果。

請記住,我正與未知數的父母工作。它可能是1級或99999

+0

看到這個答案 - http://stackoverflow.com/a/11035966/689579 – Sean

+0

這可能是由PHP循環來完成,以獲得父母/類別,並用新值查詢,直到你得到了所有但修改數據庫模型或添加存儲過程/過程會更好。 – Class

回答

2

的問題是你的數據庫模型,你可以用一個固定的追求,如果深度將永遠是三個或更少,但這並不是一個很好的解決方案。也許有個想法可以閱讀關於MySQL中分層數據的以下文章:http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

+1

你打我發佈該鏈接,+1 – Barmar

+0

@pakspul閱讀並不同意該解決方案。我曾經有過這樣的問題,很久以前就能解決。不幸的是,我不記得我怎樣才能訪問這些檔案。解決方案在SQL本身內,而不是通過更改表。 – Omar

+0

@Omar - 不幸的是,你使用MySQL,這是較爲有限。其他一些RDBMS具有支持此類查詢的功能(通常使用遞歸CTE)。你必須1)改變表,2)執行此操作在應用層,3)定義一個存儲的過程,或4)變化RDBMS。 –

1

您可以編寫一個存儲過程,該存儲過程創建一個臨時表並循環遍歷每個節點並插入類別,直到父類爲NULL,然後從該臨時表中進行SELECT按相反的順序,這樣高的節點將首先出現,然後丟棄臨時表,當你喜歡這個sqlFiddle

CREATE PROCEDURE get_hierchy(IN in_category varchar(50)) 
BEGIN 
CREATE TEMPORARY TABLE _categories(id int auto_increment primary key,category varchar(50)); 
SET @category = NULL; 
SET @parent = in_category; 
WHILE(@parent IS NOT NULL) DO 
    SET @nextparent = @parent; 
    SET @parent = NULL; 
    SELECT category,parent INTO @category,@parent FROM categories WHERE category = @nextparent; 
    INSERT INTO _categories(category) values (@category); 
END WHILE; 
SELECT category FROM _categories ORDER BY id DESC; 
DROP TABLE _categories; 
END// 

完成訂單或如果您在categories表,如果有一個auto_incremented id你知道那個節點在層次結構中位置較高的節點始終先創建,然後才能使用此查詢(sqlFiddle

SELECT category 
FROM 
    (SELECT @parent:=parent as newparent, 
      category,parent, 
      id 
    FROM categories 
    JOIN(SELECT @parent:='leasing-steps')init 
    WHERE category = @parent 
    ORDER BY id DESC 
    )cat 
ORDER BY id ASC