从mysql中的同一个表中获取父子关系的所有数据

从mysql中的同一个表中获取父子关系的所有数据,mysql,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

我正在尝试获取所有符合父子关系的行。 比如说

  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
现在我有了1209id,我想检索所有满足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

但这只给了我一张唱片。我们正在尝试获取此关系中的所有行。

如果您只是在寻找它的父母、祖父母、曾祖父母,您可以使用类似的内容

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

为了以防万一,如果你想找到所有的孩子,以及一个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

用于查找多个子女的所有父母/祖父母/曾祖父母的查询

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

MySQL几乎不支持层次关系/递归查询。您可能会发现这很有趣:。谢谢。有趣的话题。但是没有太多的时间来简单地阅读这篇文章。稍后我将阅读此内容。从类别中选择*作为子项在parent.parent\u id=child.id上加入类别作为父项此查询将提供所有数据,但当我在其中传递id=1209时,它将再次为我提供一行。太好了。我可以在第n级使用这个吗?是的,试试看,只要你孩子的id总是大于父母的id,它应该可以工作是的。我认为这总是比父母的id更大。这是有效的。谢谢我花了6个小时在这个问题上,但失败了。我添加了一个查询,用于查找第N级的所有子/孙/曾孙,以备您需要。对不起,我刚刚找到了错误。我将您的查询替换为id的“IN”子句,但它不能正常工作。这里是修改后的查询