sql - MySQL - 是否可以获取层次结构中的所有子项?

标签 sql mysql

我看过这个:

Select products where the category belongs to any category in the hierarchy

它谈论的是 CTE,它在 MySQL 中不存在。我的结构如下:

category_id | parent_category_id | name

我想检索给定category_id 的所有子类别id。这是否可以在不获取层然后循环这些层的情况下实现?

最佳答案

这只是一个简单的邻接模型表?那么在不知道最大深度的情况下就不可能在一个查询中进行。

值得深思的是Managing Hierarchical Data in MySQL (尽管我不提倡对定期更改的数据使用嵌套集模型)。

通过大量(左)连接,更具体地说:通过与树的最大深度一样多的左连接,在一个查询中将有可能实现。这就是很多人倾向于保存特定类别的“深度”的原因,因此您将能够过滤并将同一表的联接数量限制为更合理的数量。

就我个人而言,对于定期更改数据:我倾向于在插入/更新时配置触发器,这将根据 id 保存/缓存节点的当前“路径”(例如:路径是“12/62/”) 28/345',其中分隔符 / 之间的每一步都是正确顺序的父节点的主键(345 的父节点是 28,28 的父节点是 62 等),所以我可以像这样只用一个连接来查询它(/用作分隔符):

SELECT j.*
FROM tablename o
JOIN tablename j
WHERE j.path LIKE CONCAT (o.path,'/%')
AND  j.id != o.id  -- skip parent asked for.
WHERE o.id = <the id of the node you're looking for>;

关于sql - MySQL - 是否可以获取层次结构中的所有子项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3073614/

相关文章:

mysql - sql 查询或子查询

mysql - Join:三张表和一个or条件

PHP:查找订单中包含的所有产品

php - 每个输入的不同 sql 查询

sql - 从每行查询结果中选择数据

mysql 不同查询不起作用

c# - 将日期时间值插入 SQL Server 数据库

sql - 为什么从文件插入表中会生成多个映射器,而不会从另一个文件插入文件中呢?

php - 动态下拉 mysql 撇号问题

php - 我可以将 ON DUPLICATE KEY 更新与 INDEX 一起使用吗?