mysql - MySQL分层递归更新
问题描述
我需要更新 MySql 中的层次结构。这是关于商店中的类别。
桌子:
CREATE TABLE `categories` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`sort` int(11) NOT NULL,
`level` int(11) NOT NULL,
`visible` tinyint(1) NOT NULL DEFAULT '1',
`product_count` int(11) NOT NULL DEFAULT '1',
PRIMARY KEY (`id`),
KEY `sort` (`sort`),
KEY `visible` (`visible`)
);
+------+------------------------------+---------------+-------+------+
| id | name | product_count | level | sort |
+------+------------------------------+---------------+-------+------+
| 1 | Cat1 | 0 | 0 | 0 |
| 2 | Cat1.1 | 0 | 1 | 1 |
| 3 | Cat1.1.1 | 82 | 2 | 2 |
| 4 | Cat2 | 4 | 0 | 3 |
| 5 | Cat3 | 0 | 0 | 4 |
| 6 | Cat3.1 | 0 | 1 | 5 |
| 7 | Cat3.2 | 0 | 1 | 6 |
| 8 | Cat3.2.1 | 12 | 2 | 7 |
| 9 | Cat3.2.1.1 | 0 | 3 | 8 |
层次结构是使用“排序”和“级别”字段创建的。我无法改变这一点,因为它不是“我的”表格设计。
我需要一个更新,根据规则将字段“可见”设置为真或假:“如果一个类别包含产品,或者它是包含产品的类别的父级,则它是可见的”。
所以在我的例子中,结果应该是:
+------+------------------------------+---------+
| id | name | visible |
+------+------------------------------+---------+
| 1 | Cat1 | 1 |
| 2 | Cat1.1 | 1 |
| 3 | Cat1.1.1 | 1 |
| 4 | Cat2 | 1 |
| 5 | Cat3 | 1 |
| 6 | Cat3.1 | 0 |
| 7 | Cat3.2 | 1 |
| 8 | Cat3.2.1 | 1 |
| 9 | Cat3.2.1.1 | 0 |
是否可以通过 MySql 5.6 中的一个查询来解决这个问题?
解决方案
SELECT c1.id, c1.name, SUM(c2.product_count) > 0 AS visible
FROM categories AS c1
JOIN categories AS c2 ON c2.name LIKE CONCAT(c1.name, '%')
GROUP BY c1.id
推荐阅读
- apache-spark - 错误:用户没有初始化火花上下文
- angular - Angular:从后端检索用户数据后显示个人资料图片
- ssis - 从具有隐藏行的 xls 模板读取时,SSIS 错误 DTS_E_INDUCEDTRANSFORMFAILUREONERROR
- python - 返回列表字典中的值
- r - 使用 R 中的列表中的样本运行线性回归
- python - 体验 (XP) 不适用于所有用户 JSON Discord.PY
- rust - 如何将 `aarch64-none-elf` 添加到我的 Rust 工具链?
- linux - 管道输入命令
- javascript - FireBase 使用过滤器
- python - 将以下 xml 元素转换为 pandas 数据框时出现问题?