MySQL/MariaDB递归语句,如果子级与条件不匹配,则返回空

mznpcxlj  于 2022-11-08  发布在  Mysql
关注(0)|答案(1)|浏览(111)

我在数据库中有这样的表:
类别
| 标识类别|标识父项|级别深度|
| - -|- -|- -|
| 一个|第0页|第0页|
| 2个|一个|一个|
| 20个|2个|2个|
| 二十一个|2个|2个|
| 二十二个|2个|2个|
| 30个|二十二个|三个|
类别_产品
| 标识类别|id_产品|
| - -|- -|
| 2个|二百个|
| 2个|二百零一|
| 2个|二百零二|
| 20个|二百零二|
| 20个|二百零三人|
| 20个|二百零四|
我有这个语句,删除没有产品的类别。

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

你知道我怎么得到这个吗?用递归查询还是不用。

  • 谢谢-谢谢
li9yvcax

li9yvcax1#

在mysql中,您可以编写如下update语句

UPDATE category c JOIN category_product cp ON cp.`id_category` = c.`id_category` SET c.`active` = 0

如果您是从工具中执行,请确保
sql_safe_updates设置为o
因为我们正在更新而没有主键

相关问题