Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 获取给定叶ID的根节点_Mysql_Sql_Select - Fatal编程技术网

Mysql 获取给定叶ID的根节点

Mysql 获取给定叶ID的根节点,mysql,sql,select,Mysql,Sql,Select,我得到了以下表格: +-----------------+ | PRODUCTS | +-----------------+ | #product_id | | #company_id | +-----------------+ | | +---------------------+ | PRODUCT_BUNDLES | +---------------------+ | #parent_product_id

我得到了以下表格:

  +-----------------+
  | PRODUCTS        |
  +-----------------+
  | #product_id     |
  | #company_id     |
  +-----------------+
        |     |
+---------------------+
| PRODUCT_BUNDLES     |
+---------------------+
| #parent_product_id  |
| #child_product_id   |
| #company_id         |
+---------------------+
下面是一些产品的PRODUCT_BUNDLES表中ID之间关系的树状结果:

        p1
       /   \
      p2   p3
          / | \
        p4  p5 p6
用户给我以下id p2、p4、p5和p6(树的叶子),我想返回p1 id(树的根)


我如何在mysql中构建select查询来实现这一点?

您可以像这样创建
过程

CREATE PROCEDURE get_root(在id int中)
开始
声明child_id int;
声明prev_id int;
设置prev_id=id;
设置child_id=-1;
将父产品标识选择为子产品标识
来自产品捆绑包,其中子产品标识=上一个标识;
而child_id-1可以
设置上一个id=子id;
设置child_id=-1;
将父产品标识选择为子产品标识
来自产品捆绑包,其中子产品标识=上一个标识;
结束时;
选择子标识;
结束

到目前为止你做了什么?现在我只有相反的问题。从根ID中给出子代的ID<代码>选择bundles.product\u id FROM products\u bundles bom internal JOIN products ON products.product\u id=bom.parent\u product\u id internal JOIN products bundles ON bundles.product\u id=bom.child\u product\u id,其中products.product\u id=SOMEID看看这里的解决方案建议的解决方案就是我现在拥有的,但更简单:)。给定父ID获取子代。我搜索的是一个查询,它返回所有产品id都作为子代给定的父项。也许建议的解决方案是一种很好的方法,但我看不到方法。最后,使用
getconsentry
过程获得解决方案
 CREATE PROCEDURE get_root(IN id int)
  BEGIN
  DECLARE child_id int;
  DECLARE prev_id int;
  SET prev_id = id;
  SET child_id= -1 ;
  SELECT parent_product_id into child_id 
  FROM PRODUCT_BUNDLES WHERE child_product_id= prev_id ;
  WHILE child_id <> -1 DO
    SET prev_id = child_id;
    SET child_id= -1 ;
    SELECT parent_product_id into child_id 
    FROM PRODUCT_BUNDLES WHERE child_product_id = prev_id ;
  END WHILE;
  SELECT child_id ;
  END