如何解决MySQL按其他行中的值排除行
我有这张桌子:
+------------+-------------+------------------+
| 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_category
0
表示它是顶级类别(没有父母)
例如,排除具有category
aaa
的第一行,因为在第二行中有一个类别bbb
,而aaa
是bbb
的父级(对于product_id = 1)。
所需的输出:
+------------+---------------+
| product_id | category_id |
+------------+---------------+
| 1 | ccc |
| 2 | bbb |
| 2 | ddd |
因此实际上是类别结构,例如aaa->bbb->ccc
和ddd->eee->fff
。
如果产品属于aaa
bbb
ddd
类别,我想获得bbb
和ddd
。
其他信息:最初有两个表
category
和cols
`category_id`,`parent_category`
和product_to_category
和cols
`category_id`,`product_id`
产品始终出现在所有父类别中。因此,如果将产品自动添加到ccc
和aaa
时将其添加到类别bbb
。
我的想法:正在使用php,因此我会制作肮脏的php循环。
正在使用10.3.23-MariaDB
解决方法
因此,当我正确使用此功能时,您想要得到一棵树的叶子。如果您不严格依赖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
,则将无法使用。
尝试使用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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。