2012-01-22 214 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,那么树再次分解。 –