2013-02-21 44 views
2

所以我在充滿類數據庫中有一個表的結構是這樣的:有沒有更有效的方式來循環這個sql結果集?

PK INT:CAT_ID
INT:PARENT_ID
VARCHAR:cat_name

的頂層類具有空PARENT_ID,而且有可能是幾個級別的孩子。 基本上,我正在搜索字符串並將其與類別名稱進行匹配,如果該類別具有父母,那麼我希望顯示所有匹配的麪包屑時尚完整路徑。下面是僞代碼爲我現在所做的:

search_string = whatever; 
result = query db and find all category names matching "%whatever%"; 
foreach(result) 
{ 
    parent_id = result[parent_id]; 
    result_path = result[cat_name]; 
    while(parent_id != null) 
    { 
     result2 = query db and find cat_id = parent_id; 
     result_path = result2[cat_name] + " > " + result[path]; 
     parent_id = result2[parent_id]; 
    } 
    print result_path; 
} 

有沒有更有效的方法比嵌套循環和數據庫查詢,這樣做其它?

感謝您的任何意見。

+0

http://en.wikipedia.org/wiki/Join_(SQL)一般來說,任何基於父查詢結果的嵌套查詢都可以/應該被重寫爲連接。 – 2013-02-21 03:00:43

+0

我試過自己加入表格,你能給我一個關於如何編寫n級聯接的例子嗎? – user2027914 2013-02-21 03:14:43

+0

@ user2027914:你的表格有多大?如果大約數百(s) - 如何將所有內容作爲'select * from category'獲取並在php端構建樹? – zerkms 2013-02-21 03:22:54

回答

0

你有什麼是作爲鄰接列表存儲的層次結構。遞歸是在MySql或PHP中解決這個問題的唯一實用方法。

如果您正在認真尋找此特定查詢的效率,請將您的層次結構存儲爲嵌套集合。請注意,這是一項不平凡的練習,並會增加維護數據的成本。它還會降低其他查詢的效率,例如尋找兒童。

本網站有大量關於在RDMS中存儲分層數據的信息。

+0

「如果您正在認真尋找效率,那麼將您的層次結構存儲爲嵌套集合」 - 事實並非如此。 「鄰接表很少是最好的方法。」 ---這也不是真的。 – zerkms 2013-02-21 07:53:00

+1

謝謝你的回覆。鄰接列表與嵌套集似乎正是我需要在這裏看的。我發現這個鏈接是一個非常有用的兩個比較:[管理MySQL中的分層數據](http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/) – user2027914 2013-02-21 08:00:38

+0

不需要感謝,只是接受答案! – 2013-02-21 08:12:31

相關問題