MySQL - 获取特定父级的子项

3
如果我运行以下查询:
SELECT loc2.* FROM `locations` AS loc INNER JOIN `locations` AS loc2 ON loc.location_id = loc2.location_parent WHERE loc.location_status='publish'
我会得到以下结果:
实际上,我正在尝试从数据库中获取所有子代/孙代。现在,上面的查询仅按父子规则排序并返回所有行。但是,我想向SQL添加条件,以便它仅获取特定父级的子代。
例如,我想获取19的所有子行/节点/位置。结果集应该如下所示:
我尝试了这个:
SELECT loc2.* FROM `locations` AS loc INNER JOIN `locations` AS loc2 ON loc.location_id = loc2.location_parent WHERE loc.location_status='publish' AND loc2.location_parent=19
和这个:
SELECT loc2.* FROM `locations` AS loc INNER JOIN `locations` AS loc2 ON loc.location_id = loc2.location_parent WHERE loc.location_status='publish' AND loc.location_parent=19
但它们都返回相同的结果,正如它应该:

那么,我应该做些什么才能达成我所需的结果呢?


MySQL不支持分层/递归查询。您需要使用存储过程来实现您想要的功能,而不是使用select语句--或更改数据结构,使整个路径作为一列。 - Gordon Linoff
...或者将表格自我连接(尽可能多地连接),或者在应用程序级别代码中处理递归(例如PHP),或者使用嵌套集(而不是所谓的“边缘”或“邻接列表”所示,或者GL建议的材料化路径)。 - Strawberry
...或者切换到不同的 DBMS。 - Alexander
2个回答

0

实际上,这是数据库的一个高级主题,称为递归。您的要求是从最顶层的父节点及其所有子节点、孙子节点等获取数据树。

其他DBMS已经提供了解决此类问题的功能,例如Microsoft SQL Server将其解决方案称为CTE(公共表达式),但是在MySQL中长期以来一直没有提供此功能,因此没有简单的解决方案来解决您的问题。不过,您可以在MySQL中搜索递归以获取有关此主题的更多详细信息。


0
你需要的是所谓的“闭包”表。它本质上是一张用于保存分层数据的子节点、父节点和深度引用的表格。
我在这里找到了一篇优秀的文章,可以帮助你达到预期结果。如何在关系型数据库中存储分层数据?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接