使用MySQL中的邻接模型抓取父节点的子节点

时间:2013-04-02 23:57:17

标签: mysql nodes adjacency-list-model

我的MySQL表的当前模型有困难,即我似乎无法正确查询特定父节点的所有子节点。正如标题所述,我正在使用邻接模型。

问题在于,我在网上找到的大多数方法都是查询所有叶子节点,或者选择的不仅仅是我试图抓取的内容。

我关注的第一个教程是MikeHillyer.com,他的解决方案是:

SELECT t1.name FROM
category AS t1 LEFT JOIN category as t2
ON t1.category_id = t2.parent
WHERE t2.category_id IS NULL;

这个问题是它查询所有叶子节点,而不仅仅是与父节点相关的节点。他还建议使用嵌套集模型,我 REALLY 不希望使用它,因为插入新节点要困难一些(我确实意识到它的重要性,我会只是不必诉诸它。)

我找到的下一个解决方案是在幻灯片53上的共享slideshow上(从StackOverflow上的另一个答案中找到)。这个解决方案应该只是查询节点的直接子节点......解决方案对我来说似乎不起作用。

以下是他们的解决方案:

SELECT * FROM Comments cl
LEFT JOIN Comments c2
  ON(c2.parent_id = cl.comment_id);

现在,我的表格略有不同,所以我调整了一些代码。我的表的简短摘录如下:

 Table: category
 id | parent | section  | title    | ...
----+--------+----------+----------+-----
 1  |  NULL  | home     | Home     | ...
 2  |  NULL  | software | Software | ...
 3  |   2    | software | Desktop  | ...
 4  |   2    | software | Mobile   | ...
 5  |  NULL  | about    | About    | ...
 6  |   5    | about    | Legal    | ...
... |  ...   |  ...     |  ...     | ...

当我修改上述查询时,我执行了以下操作:

SELECT * FROM category cat1
LEFT JOIN category cat2
  ON(category.parent = cl.id);

这导致一切被查询并且在表中被绑定的时间是未更改的表的两倍(显然不是我正在寻找的)

我很确定我的查询只是做错了,所以我只是希望有人可以纠正我的错误并指出正确的方向。

我知道使用嵌套集模型应该更容易,但我不喜欢添加新选项的选项。

1 个答案:

答案 0 :(得分:2)

看起来你非常接近。您的左连接保证将返回表中的所有记录。

请参阅以下查询。

SELECT c1.*, c2.id FROM category c1 INNER JOIN category c2 ON (c1.parent = c2.id);