2012-09-09 22 views
0

我正在使用MySQL 5.5。假設我有一個具有「N-森林」結構如下的SQL表:帶有「森林」結構的表上的SQL查詢

create table foo 
(
    id int not null primary key, 
    parent_id int, 
    bar varchar(255), 

    foreign key (parent_id) references foo (id) 
) 

parent_id如果是null它表示一個根元素。我們也保證它是非循環的。

我現在想id@x及其所有子(即含有ID @x和遞歸是在這個組中的任何PARENT_ID一行行的集)預排序來選擇行:

select * from foo where parent_id=DescendantOf(@x) sort by Preorder 

可以使用什麼SQL語句? (如果需要修改表結構允許)

此外,我想找到一個給定元素的根ID:

select RootOf(@x) from foo 

我怎麼能這樣做?

MySQL可以有效處理這個問題,還是需要維護我自己的索引或輔助表?

回答

0

AFAIK有MySQL中沒有這樣的functonality內置... Oracle有一種叫做你想要做什麼「分層查詢」功能...

在MySQL中,您可以實現/模擬它雖然「如何「相當複雜 - 一個非常好的演練見this article

+1

其實它不僅是Oracle。許多主要的數據庫管理系統(Oracle,PostgreSQL,Firebird,DB2,SQL Server,Teradata)現在都通過「*遞歸公用表表達式*」支持分層查詢* –

+0

@a_horse_with_no_name你是絕對正確的......我剛剛提到Oracle,由Oracle ... – Yahia