首页 > 解决方案 > 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 中的一个查询来解决这个问题?

标签: mysql

解决方案


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

推荐阅读