zoukankan      html  css  js  c++  java
  • sql

    我有一个MySQL表,如下所示:

    id | name        | parent_id
    19 | category1   | 0
    20 | category2   | 19
    21 | category3   | 20
    22 | category4   | 21
    ......
    

      

    现在,我想要一个MySQL查询,我只提供id [例如说'id = 19']然后我应该得到它的所有子ID [即 结果应该有ids '20,21,22'] ....而且,孩子们的等级不知道它可以变化....

    另外,我已经有了使用for循环的解决方案.....如果可能的话,让我知道如何使用单个MySQL查询来实现相同的功能。

    解决办法

    1.如果你在MySql 8上,那么使用递归where子句:

    with recursive cte (id, name, parent_id) as (
      select     id,
                 name,
                 parent_id
      from       products
      where      parent_id = 19
      union all
      select     p.id,
                 p.name,
                 p.parent_id
      from       products p
      inner join cte
              on p.parent_id = cte.id
    )
    select * from cte;

    where中指定的值应设置为要选择所有后代的父级的CONNECT BY

    2.对于不支持公用表表达式(最高版本为5.7)的MySql版本,您可以使用以下查询来实现此目的:

    select  id,
            name,
            parent_id 
    from    (select * from products
             order by parent_id, id) products_sorted,
            (select @pv := '19') initialisation
    where   find_in_set(parent_id, @pv)
    and     length(@pv := concat(@pv, ',', id))

    这是一个小提琴。

    此处,where中指定的值应设置为要选择所有后代的父级的CONNECT BY

  • 相关阅读:
    洛谷 P4707 重返现世
    多项式总结&多项式板子
    线性常系数齐次递推
    洛谷 P2791 幼儿园篮球题
    CF Gym 102028G Shortest Paths on Random Forests
    洛谷 P4705 玩游戏
    [NOI2018]冒泡排序
    PKUSC2019 改题记录
    PKUSC2019 没约记
    Codeforces Round #557 题解【更完了】
  • 原文地址:https://www.cnblogs.com/foreversun/p/11401581.html
Copyright © 2011-2022 走看看