mariadb Mysql通过其他行中的值排除行(获取树的叶子)

p5fdfcr1  于 2022-11-08  发布在  Mysql
关注(0)|答案(2)|浏览(137)

我有这张表:

+------------+-------------+------------------+
| product_id | category_id |  parent_category |
+------------+-------------+------------------+
|          1 |         aaa |                0 |
|          1 |         bbb |              aaa |
|          1 |         ccc |              bbb |
|          2 |         aaa |                0 |
|          2 |         bbb |              aaa |
|          2 |         ddd |                0 |

因此,我想排除相同product_id中的父类别,以便从表中仅获取最低级别的类别。parent_category0表示它是顶级类别(没有父类别)
例如,排除具有categoryaaa的第一行,因为在第二行中有类别bbb,并且aaabbb的父级(对于product_id=1)。
所需输出:

+------------+---------------+
| product_id |   category_id |
+------------+---------------+
|          1 |           ccc |          
|          2 |           bbb |           
|          2 |           ddd |

所以实际上是aaa->bbb->cccddd->eee->fff这样的类别结构。如果产品在aaabbbddd类别中,我想得到bbbddd
我的思绪:php正在使用中,所以我会创建脏的php循环。
编辑:阐明获取树叶是一个问题

mutmk8jj

mutmk8jj1#

如果你没有严格地绑定到recursive CTE,你可以简单地检查一个给定的类别是否有子类别。如果没有-它是一个叶子(尊重相同的product_id)。

SELECT product_id, category_id
FROM categories c
WHERE
    (
        SELECT
            count(*)
        FROM
            categories c2
        WHERE
            c2.parent_category = c.category_id
            AND c2.product_id = c.product_id
    ) = 0

工作example
如果你想检查每个父节点的product_id,这是行不通的。

atmip9wb

atmip9wb2#

尝试使用recursive CTE

with recursive cte as (
      select 
        *, 0 as level, concat(product_id, '-', category_id) as ar 
      from 
        samp 
      where 
        parent_category ='0'
union all
      select 
        t1.*, t2.level+1, ar
      from samp t1 
        inner join 
           cte t2 
        on t1.parent_category =t2.category_id and t1.product_id=t2.product_id
),
cte1 as (
      select 
        *, row_number() over (partition by ar order by level desc) as rank_ 
      from 
        cte 
         )

    select 
        product_id, category_id, parent_category 
    from 
        cte1 
    where 
        rank_=1

DEMO

相关问题