2016-04-09 99 views
2

我想要获得满足父子关系的所有行。 例如从mysql中的同一个表中获取父子关系的所有数据

id   Title parent_id 
    1200  A  1000 
    1201  B  1000 
    1202  C  1000 
    1203  D  1000 
    1204  E  1200 
    1205  F  1200 
    1206  G  1201 
    1207  H  1205 
    1208  I  1205 
    1209  J  1205 

现在我有1209的ID,我想要检索满足父子关系船为1209喜欢这里1209关于1205,1205关于1200的所有行,和1200涉及到1000

我尝试这个查询

SELECT * FROM `category` a left join category b on a.id=b.parent_id where a.id=1209 

但是,这是给我的只有一个记录。我们试图获取所有与这种关系相关的行。

+0

的MySQL有层次关系/递归查询的支持很少。你可能会觉得这很有趣:http://stackoverflow.com/questions/4048151/what-are-the-options-for-storing-hierarchical-data-in-a-relational-database。 –

+0

谢谢。有趣的话题。但是没有太多时间来简要阅读。我会在稍后阅读。 –

+0

select * from category as child join parent.parent_id = child.id 这个查询给我所有的数据,但是当我传入id = 1209的时候,然后它再给我一行。 –

回答

5

如果你只是在寻找它的父母,祖父母,伟大的家长,你可以使用这样的东西。

SELECT id,title,parent_id FROM 
    (SELECT id,title,parent_id, 
     CASE WHEN id = 1209 THEN @id := parent_id 
      WHEN id = @id THEN @id := parent_id 
      END as checkId 
    FROM Test 
    ORDER BY id DESC) as T 
WHERE checkId IS NOT NULL 

sqlfiddle

和公正的,如果你想找到所有儿童的情况下,和孙子女或ID的大孙子,你可以使用这个

SELECT id,title,parent_id FROM 
    (SELECT id,title,parent_id, 
      CASE WHEN id = 1200 THEN @idlist := CONCAT(id) 
       WHEN FIND_IN_SET(parent_id,@idlist) THEN @idlist := CONCAT(@idlist,',',id) 
      END as checkId 
    FROM Test 
    ORDER BY id ASC) as T 
WHERE checkId IS NOT NULL 

sqlfiddle for finding children

查询找到所有父母/祖父母/多个孩子的伟大祖父母

SELECT id,title,parent_id FROM 
(SELECT id,title,parent_id, 
     CASE WHEN id in (1209,1206) THEN @idlist := CONCAT(IFNULL(@idlist,''),',',parent_id) 
      WHEN FIND_IN_SET(id,@idlist) THEN @idlist := CONCAT(@idlist,',',parent_id) 
      END as checkId 
FROM Test 
ORDER BY id DESC)T 
WHERE checkId IS NOT NULL 

sqlfiddle

+0

太好了。我可以在第n级使用这个吗? –

+0

是啊试一下,只要你的孩子的ID总是大于父母的ID它应该工作 –

+0

是的。我认为这总是大于父母的身份证。 它的工作。谢谢。我花了6个小时,但失败了。 –

相关问题