【发布时间】:2022-07-08 13:08:11
【问题描述】:
我在数据库中有这样的表:
类别
| id_category | id_parent | level_depth |
|---|---|---|
| 1 | 0 | 0 |
| 2 | 1 | 1 |
| 20 | 2 | 2 |
| 21 | 2 | 2 |
| 22 | 2 | 2 |
| 30 | 22 | 3 |
category_product
| id_category | id_product |
|---|---|
| 2 | 200 |
| 2 | 201 |
| 2 | 202 |
| 20 | 202 |
| 20 | 203 |
| 20 | 204 |
我有这个声明,删除没有产品的类别。
Db::getInstance()->execute('UPDATE '._DB_PREFIX_.'category SET `active` = 0 WHERE `id_category` NOT IN(SELECT `id_category` FROM '._DB_PREFIX_.'category_product)');
但这对我不起作用,因为如果子类别确实有产品,我不想删除父类别。 我想获得没有产品的类别,而他们的所有孩子也没有产品。
我一直在试验递归选择语句,但我需要它不返回任何内容,以防任何孩子有产品。 此查询不正确,因为它返回所有没有任何产品的类别以及所有没有产品的子类别。
with recursive decendents as (
-- Category that has no Products
Select c.id_category
FROM category c
WHERE c.id_category NOT IN(SELECT id_category
FROM category_product)
join all
-- child categories
SELECT c.id_category
FROM category c, descendants d
WHERE c.id_parent = d.id_category AND c.id_category NOT IN(SELECT id_category
FROM category_product)
)
SELECT id_category From descendants
知道我怎么能得到这个吗?是否使用递归查询。
谢谢。
【问题讨论】:
-
显示所需的最终数据状态
-
我想获取其子类别没有产品的类别。如果任何子类别包含产品 - 不返回任何内容。如果不是,则返回类别树。 category_id
标签: php mysql mariadb recursive-query