我对我的 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;
问题在于,它查询所有叶节点,而不仅仅是与父节点相关的叶节点。他还建议使用嵌套集模型,我真的不想使用它,因为插入新节点有点困难(我确实意识到它的重要性,我宁愿不必求助于它)。
我找到的下一个解决方案是幻灯片 53 上的共享幻灯片(从 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);
这导致所有东西都被查询并绑定在一个表中,是未更改表的两倍(显然不是我想要的)
我很确定我只是对我的查询做错了,所以我只是希望这里有人能纠正我的错误并指出我正确的方向。
我知道使用嵌套集模型应该更容易,但我只是不喜欢该选项,因为难以添加新选项。