【问题标题】:MySQL hierarchical recursive updateMySQL分层递归更新
【发布时间】:2018-12-17 04:59:27
【问题描述】:

我需要更新 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


【解决方案1】:
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

【讨论】:

    猜你喜欢
    • 2010-09-21
    • 2018-07-09
    • 2010-10-11
    相关资源
    最近更新 更多