返回自关联表的所有树族

时间:2013-06-03 14:56:28

标签: mysql sql database

我有这样的数据库结构:

表:cat(id,fk_cat,name)

字段id_test指向同一个表。

实施例。 玩具>体育>球

当我搜索Ball时,我还需要:运动和玩具。 第一个父级是fk_cat = null。 所以: id = 1,fk_cat = null,name ='Toy' id = 2,fk_cat = 1,name ='Sports' id = 3,fk_cat = 2,name ='Ball'。

问题是,我如何用单个sql处理我的所有家谱? 请参阅http://sqlfiddle.com/#!2/8bc257/2进行测试

1 个答案:

答案 0 :(得分:3)

您所描述的父/子关系称为Adjacency List Model,在MySQL中很难遍历(其他RDBMS可以使用Recursive Common Table Expressions来处理)。

如果您知道父母/子女关系的潜在数量,您可以使用OUTER JOINs为每个潜在关系(祖父母,父母,孩子等)加入自己的表格。以下是最多3个级别的示例:

select 
  cc.id idchild, 
  ccparent.id idparent,
  ccgrandparent.id idgrandparent
from con_categoria cc
  left join con_categoria ccparent on cc.fk_cat = ccparent.id
  left join con_categoria ccgrandparent on ccparent.fk_cat = ccgrandparent.id
where cc.fk_cat = 378

如果您不知道潜在孩子的最大数量,那么您需要在函数或过程中使用Dynamic Sql。搜索SO,你应该看到一些例子。

作为建议,如果可以选择,请考虑使用Nested Set Model。查询分层数据要容易得多。这是一篇关于这个主题的好文章以及与Adjacency List Model

的比较

http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/