2012-01-22 264 views
1

我有一個名爲foo的db表。它具有以下字段:嵌套/遞歸MySQL查詢

  • ID
  • parentId的

可降至3級深,像這樣:

  • 美孚1(parentId的:0)
    • Foo 2(parentId:1)(foo的孩子1)
      • 美孚3(parentId的:2)(兩者foo1和foo2的的孩子)

現在的問題是,在我的用戶表,有一個叫做場fooId。我想獲得屬於頂級foo的所有用戶。例如,如果用戶的fooId是3,並且我想要獲得與fooId 1相關的所有用戶(來自上述示例),那麼應該將該用戶計入結果中。

如果這只是兩層深,我可以做這樣的事情:

`SELECT stuff FROM users, foo WHERE foo.parentId = '1' AND user.fooId = foo.id 

但我怎麼能做到這一點在目前的情況?

+0

下面也許能派上用場http://stackoverflow.com/questions/5291054/hierarchical-sql-problem/5291159#5291 159 –

回答

1

我敢肯定,我的邏輯是在這裏的一些點搞砸了......但它可以讓你在正確的方向

SELECT stuff 
FROM users, foo 
WHERE (foo.parentId = '1' AND user.fooId = foo.id) 
OR user.fooId IN (
    SELECT fooid from foo where parentID IN (
    SELECT fooid from foo where parentID = '1' 
) 
) 
+0

一目瞭然,這應該起作用,但我認爲它不會高度可擴展,所以它將取決於需要處理多少個可能的ID。一個[嵌套集模型](http://www.fliquidstudios.com/2008/12/23/nested-set-in-mysql/)可能會更有效率,但他們可以採取一些維護工作。正確的觸發器通常可以解決與他們有關的問題。 – Ilion

+0

我不得不同意,這不能表現出卓越的性能。看起來,雖然這應該貫穿各種關係表。喜歡,自引用habtm協會 –

1

可能是這樣的......

SELECT stuff FROM users, foo WHERE foo.parentId = '1' AND user.fooId = foo.id UNION SELECT stuff FROM users WHERE fooId = '3'

編輯: SELECT stuff FROM users, foo WHERE foo.parentId = '1' AND user.fooId = foo.id UNION ALL SELECT stuff FROM users WHERE fooId = '3'

+0

如果FooID#4也是fooid#2的孩子,那麼這將不起作用 –

+0

只是用'UNION ALL'替換'UNION',這應該做到這一點...... – sally

+0

這仍然沒有' t佔其他Foo的。對於OP所給出的例子,這是靜態的。同樣,如果Foo2有另一個孩子Foo4,甚至Foo5,這個查詢只會得到Foo3。或者如果Foo1被給予孩子Foo6,那麼樹再次分解。 –