MySQL分层递归更新

时间:2018-07-09 13:27:01

标签: 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 | 

使用字段“ sort”和“ level”创建层次结构。我无法更改此设置,因为它不是“我的”表格设计。

我需要一个UPDATE来根据以下规则将字段“ visible”设置为true或false:“如果类别包含产品,或者它是包含产品类别的父项,则该类别可见。”

所以在我的示例中,结果应该是:

+------+------------------------------+---------+
| 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中是否可以通过一个查询解决这个问题?

1 个答案:

答案 0 :(得分:0)

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