【问题标题】:MySQL/MariaDB recursive statement, Return empty if children do not match conditionMySQL/MariaDB 递归语句,如果孩子不匹配条件则返回空
【发布时间】: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


【解决方案1】:

在mysql中可以这样写更新语句

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

如果您从工具中执行它,请确保

sql_safe_updates 设置o

因为我们正在更新没有主键

更新:内部连接仅在两个表中都存在主键时才返回行,如果我们愿意,我们可以在末尾添加 where 条件作为双重检查

【讨论】:

  • 好的,谢谢,但同时我想检查子类别是否有产品。如果某些子类别包含产品,我无法停用父类别。
  • 内连接仅在两个表中都存在主键时才返回行,如果我们愿意,我们可以在末尾添加 where 条件作为双重检查
猜你喜欢
  • 2012-10-28
  • 2021-10-18
  • 2018-12-03
  • 2015-12-22
  • 2018-08-25
  • 2019-11-10
  • 1970-01-01
  • 1970-01-01
  • 2010-10-30
相关资源
最近更新 更多